Marschall/Un-Marschall-Liste Objekten in Jersey JAX-RS mit JAXB
Guten Morgen. Heute morgen, als ich werde durch Jersey-Entity-Provider MessageBodyReader
s und MessageBodyWriter
s stieß ich auf Folgendes problem.
Ich schreiben wollen, eine Ressource-Methode und der client gibt eine Liste benutzerdefinierter Objekte und Medien-Typ ist application/xml
. Also ich möchte mit JAXB (ich bin neu auf JAXB). Ich war in der Lage, dies zu erreichen durch das schreiben meiner eigenen erweiterten MessageBodyReader
und MessageBodyWriter
. Aber ich fürchte, so wie ich bin folgenden. Schauen Sie sich einfach die Weise, die ich umgesetzt:
Ressource-Methode:
@Path("productlist/xml")
@GET
public RetObjects getProductsXml(){
List<Product> pList = new ArrayList<Product>();
pList.add(new Product("1","Dell latitude E6000",2900,500));
pList.add(new Product("2","Xperia Z2",549,400));
RetObjects obj = new RetObjects();
obj.setObject(pList);
return obj;
}
Meine benutzerdefinierte Objekte:
@Entity
@Table (name="PRODUCT")
@XmlRootElement(name="product")
public class Product {
@Id
@Column(name = "CODE")
private String code;
...
//rest of the fields, constructors, getters and setters
}
Objekt umschließt, die meine Liste der benutzerdefinierten Objekt:
@XmlRootElement(name = "products")
@XmlAccessorType (XmlAccessType.FIELD)
public class RetObjects {
@XmlElement(name = "product")
private List<Product> object = null;
public List<Product> getObject() {
return object;
}
public void setObject(List<Product> object) {
this.object = object;
}
}
MessageBodyReader/Writer
sind gerade nach vorne nur mit Jaxb unmarshaller und marshaller über die RetObjects
Objekt.
Mit dieser Implementierung ist es wunderbar funktioniert, wie erwartet und ich bin in der Lage zu Holen die RetObjects
einwickeln der Liste der Produkte, die perfekt an den client.
Hier meine Frage ist, anstelle von Geschenkpapier auf meiner Liste der Produkte, die in einem intermediären Objekt RetObjects
in meinem Fall, konnte ich nicht marshal-und unmarshal-Liste der Produkte-Objekt direkt. Wenn ich schreiben möchte, ein weiterer service, gibt Liste der Aufträge, die ich brauche, um wickeln Sie diesen mit einer zwischen-Objekt. Was ist der richtige Ansatz, dies zu erreichen? Wie könnte ich dies tun, ohne zwischen Objekten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten
Du nicht müssen Ihre eigenen
MessageBodyWriter/Reader
. Jersey/JAX-RS bereits über standard support für diese. Ich würde stick mit den Standardeinstellungen, es sei denn, Sie haben eine wirklich, wirklich guten Grund benötigt zu Schüren Ihre eigenen.Zweiten
Brauchen wir nicht die Hülle, können Sie einfach zurückgeben
GenericEntity
. Diese wird automatisch wickeln Sie die Elemente in einem "plural-wrapper" - element, d.h.<product>
-><products>
.Für die Annahme einer Stelle in der Ressource-Methode, einfach zu akzeptieren
List<Product>
als argument genug. Wird es akzeptieren<products><product/><product/></products>
UPDATE
Abrufen der
List<Product>
auf der client-Seite sollten wir nutzenGenericType
. Se dieser Beitrag.Jersey 1
Jersey 2/JAX-RS 2
RepObject2
? Es sollteGenericType
readEntity
, die eineGenericType
argument.javax.ws.rs.core.GenericType
. Es ist eine tatsächliche Klasse. Sie sollen nicht Ihre eigenen "Generic type" 🙂 Sorry wenn ich nicht klar machen, dass zunächst.