早上好。今天早上,当我通过泽西实体提供商MessageBodyReader
和MessageBodyWriter
时,我遇到了以下问题。
我想编写一个资源方法和客户端,它返回一个自定义对象列表,媒体类型为application/xml
。所以我想使用JAXB(我是JAXB的新手)。我通过编写自己的扩展MessageBodyReader
和MessageBodyWriter
来实现这一目标。但我害怕我跟随的方式。看看我实施的方式:
资源方法:
@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;
}
我的自定义对象:
@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
}
包装我的自定义对象列表的对象:
@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
对象上使用Jaxb unmarshaller和marshaller, RetObjects
就可以了。
通过这个实现,它正如预期的那样正常工作,并且我能够在客户端完美地获取包含产品列表的RetObjects
。
我的问题是,在我的情况下,不是将我的产品列表包装到中间对象RetObjects
中,而是我不能直接编组和解组产品列表对象。如果我想编写另一个返回订单列表的服务,我需要用另一个中间对象包装它。实现这一目标的正确方法是什么?如果没有中间对象,我怎么能这样做?
答案 0 :(得分:7)
首先
您不 您自己的MessageBodyWriter/Reader
。 Jersey / JAX-RS alread对此有标准支持。我会坚持使用默认值,除非你有一个真的,非常的理由需要你自己动手。
<强>第二强>
我们不需要包装器,您可以简单地返回GenericEntity
。这将自动将元素包装在“复数包装”元素中,即<product>
- &gt; <products>
。
List<Product> list = new ArrayList<>();
GenericEntity<List<String>> entity = new GenericEntity<List<Product>>(list) {};
Response response = Response.ok(entity).build();
要在资源方法中接受正文,只需接受List<Product>
作为参数就足够了。它将接受<products><product/><product/></products>
<强>更新强>
要在客户端检索List<Product>
,我们应该使用GenericType
。 Se this post。
泽西岛1
WebResource resource = client.resource("...");
List<Product> products = resource.get(new GenericType<List<Product>>(){});
Jersey 2 / JAX-RS 2
Response response = ...
List<Product> products = response.readEntity(new GenericType<List<Product>>(){});