Serialisierungsproblem bei JAX-RS

kidsos

Aktives Mitglied
Hallo,

ich bin gerade dabei einen Rest-Webservice (mit Jersey) zu schreiben und habe das Problem, dass meine Objekte nicht richtig serialisiert werden. Am besten mache ich das mal an einem Beispiel deutlich:

Java:
@MappedSuperclass
public abstract class AbstractBaseEntity<ID extends Serializable> implements BaseEntity<ID> {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private ID id;

    public ID getId() {
        return id;
    }

    protected void setId(final ID id) {
        this.id = id;
    }
}
Java:
@XmlRootElement(name = "category")
@Entity
public class Category extends AbstractBaseEntity<Long> {
	private static final long serialVersionUID = 1L;
	private String name;

	public Category() {
	}

	public Category(String name) {
		this.name = name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}

Wenn ich nun per Rest-Webservice eine Category abfragen möchte, bekomme ich immer nur das hier angezeigt:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<category>
<name>Kategorie 1</name>
</category>[/XML]

Aber warum wird das id-Attribut aus der Basisklasse nicht serialisiert? Kennt hier jemand eine Lösung dafür?

Grüße

PS: Das gleiche Problem wurde übrigens auch hier angesprochen, leider ohne konkrete Lösung :(
 
G

gman

Gast
Hi,

mal ein paar Fragen:

- Wieso ist denn der Setter für die Id protected und nicht auch public wie der Getter?

- Ist "ID" (in der "AbstractBaseEntity" eine Klasse oder soll das der Platzhalter für Generics sein?
 

mvitz

Top Contributor
Das Problem ist, dass JAXB (welches intern für das Umwandeln von und in XML genutzt wird) keine Interfaces serialisieren kann und Serializable nun mal ein Interface ist, und JAXB nicht weiß, welche Konkrete Klasse nun deine ID darstellt.

Folgendes funktioniert übrigens ohne Probleme:

Java:
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;

public abstract class BaseEntity implements Serializable {
    @XmlElement private Long id;
    public Long getId() { return id; }
    protected void setId(final Long theId) { id = theId; }
}

Java:
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Entity extends BaseEntity {
    private String name;
    public String getName() { return name; }
    public void setName(final String theName) { name = theName; }
}
 

kidsos

Aktives Mitglied
Das Problem ist, dass JAXB (welches intern für das Umwandeln von und in XML genutzt wird) keine Interfaces serialisieren kann
Ach, stimmt ja, hab ich ganz vergessen. :)

Wie du es jetzt gemacht hast, funktioniert es jedenfalls jetzt auch bei mir. Da ich sowieso immer ein Long als Datentyp für das id-Attribut vergeben habe, kann ich das auch gleich in der BaseEntity-Klasse machen.

Tja, manchmal sieht man echt den Wald vor lauter Bäumen nicht.

Danke für den Tipp
 

Neue Themen


Oben