Marshal/Un marshal使用JAXB在Jersey JAX-RS中列出对象

HJK*_*HJK 1 java jax-rs jaxb jersey jersey-2.0

早上好.今天早上,当我通过泽西实体提供商MessageBodyReaderMessageBodyWriters时,我遇到了以下问题.

我想编写一个资源方法和客户端,它返回一个自定义对象列表和媒体类型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;
}
Run Code Online (Sandbox Code Playgroud)

我的自定义对象:

@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
 }
Run Code Online (Sandbox Code Playgroud)

包装我的自定义对象列表的对象:

 @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;
     }
 }
Run Code Online (Sandbox Code Playgroud)

MessageBodyReader/Writer只是在RetObjects对象上使用Jaxb unmarshaller和marshaller是直截了当的.

通过这个实现,它正如预期的那样正常工作,并且我能够RetObjects在客户端完美地获取包装产品列表.

在这里,我的问题是,RetObjects在我的情况下,不是将我的产品列表包装到中间对象中,而是我不能直接编组和解组产品列表对象.如果我想编写另一个返回订单列表的服务,我需要用另一个中间对象包装它.实现这一目标的正确方法是什么?没有中间对象我怎么能这样做?

Pau*_*tha 7

第一

不需要自己的MessageBodyWriter/Reader.Jersey/JAX-RS alread对此有标准支持.我会坚持默认,除非你有一个真正的,非常好的理由需要你自己.

第二

我们不需要包装器,你可以简单地返回一个GenericEntity.这将自动将元素包装在"复数包装"元素中,即<product>- > <products>.

List<Product> list = new ArrayList<>();
GenericEntity<List<String>> entity = new GenericEntity<List<Product>>(list) {};
Response response = Response.ok(entity).build();
Run Code Online (Sandbox Code Playgroud)

为了接受资源方法中的主体,仅仅接受List<Product>作为参数就足够了.它会接受<products><product/><product/></products>


UPDATE

List<Product>在客户端检索,我们应该使用GenericType.看这篇文章.

泽西岛1

WebResource resource = client.resource("...");
List<Product> products = resource.get(new GenericType<List<Product>>(){});
Run Code Online (Sandbox Code Playgroud)

泽西2/JAX-RS 2

Response response = ...
List<Product> products = response.readEntity(new GenericType<List<Product>>(){});
Run Code Online (Sandbox Code Playgroud)