Marshalling von generischen Typen, die in Jersey
Ich brauchen, um wieder in der client-Liste von paar Ergebnisse und die Gesamtzahl der Ergebnisse. Ich habe es auf mehreren Orten mit verschiedenen Personen, so möchte ich eine generische Klasse mit diesen beiden Attributen:
@XmlRootElement
public class QueryResult<T> implements Serializable {
private int count;
private List<T> result;
public QueryResult() {
}
public void setCount(int count) {
this.count = count;
}
public void setResult(List<T> result) {
this.result = result;
}
public int getCount() {
return count;
}
public List<T> getResult() {
return result;
}
}
Und der service:
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public QueryResult<TestEntity> findAll(
QueryResult<TestEntity> findAll = facade.findAllWithCount();
return findAll;
}
Person ist nicht wichtig:
@XmlRootElement
public class TestEntity implements Serializable {
...
}
Aber diese Ursachen: javax.xml.bind.JAXBException: class test.TestEntity nor any of its super class is known to this context.
Rückkehr der just-Kollektion ist einfach, aber ich weiß nicht, wie die Rückkehr meiner eigenen generischen Typ. Ich habe versucht, zu verwenden GenericType
aber ohne Erfolg - ich denke, es ist ment für Sammlungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem er gegen dieses selbst entdeckte ich, die Antwort ist ziemlich einfach.
In Ihrem Dienst zurückkehren, eine integrierte Reaktion eines GenericEntity (http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/GenericEntity.html) entsprechend typisiert. Zum Beispiel:
Finden Sie in diesem Beitrag, warum Sie nicht einfach zurück GenericEntity: Jersey GenericEntity Nicht Funktioniert
Eine komplexere Lösung wäre die Rückkehr der GenericEntity direkt und erstellen Sie Ihre eigenen XmlAdapter (http://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html) zu behandeln marshalling/unmarshalling. Ich habe nicht versucht, dieses, obwohl, so ist es nur eine Theorie.
Ich löste es mit
@XmlSeeAlso
Anmerkung:Andere Möglichkeit ist die Verwendung von
@XmlElementRefs
.QueryResult
für unterschiedliche Ergebnis-Typen, dann wird dies unpraktisch.Ich hatte genau das gleiche Problem. Das problem tritt auf, weil der Java type erasure.
Mein Erster Ansatz zu generieren, wurde ein Ergebnis-Klasse für jeden Entitätstyp:
Kehrte ich die generische
QueryResult<>
in meinem serivces nur für built-in Typen wieQueryResult<String>
oderQueryResult<Integer>
Aber das war umständlich, denn ich hatte eine Menge von Entitäten. So mein anderer Ansatz war die Verwendung nur JSON und ich änderte mein Ergebnis Klasse nicht generisch und verwenden Sie ein
Object
Ergebnis-Feld:Es funktioniert gut, Jersey ist in der Lage, sich zu serialisieren alles, was ich geben es in JSON (Hinweis: ich weiß nicht, ob das wichtig ist, aber die
QueryResult
und alle meine Einheiten noch@Xml...
Anmerkungen. Dies funktioniert auch für Listen mit eigenen entity-Typen.Wenn Sie Probleme haben, mit Sammlungen, können Sie auch sehen diese Frage