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