RestEasy客户端:如何包装列表元素?

时间:2013-02-07 15:21:26

标签: rest jaxb client resteasy

我正在尝试为RestEasy REST服务创建RestEasy客户端,提供此实体:

@SuppressWarnings("serial")
@Entity @Table(name="product")
@XmlRootElement(name="product")
public class Product implements Serializable, IHasTraits {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "INT UNSIGNED")
    private Long id;

结果是

[{"id":1,"name":"FOO","note":null,...}]

然后我尝试通过界面阅读它。 我希望可以使用相同的模型类。

@Path("/")
public interface RestClient {

    @GET
    @Path("/products")
    @Produces("application/json")
    public List<Product> getProducts();

使用

    RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
    this.client = ProxyFactory.create(RestClient.class, "http://localhost:8080/essc-portal/rest");

但客户抛出:

  

引起:javax.xml.bind.UnmarshalException     - 链接例外:
  [com.sun.istack.SAXParseException2; columnNumber:0;意外元素(uri:“”,local:“id”)。预期元素为&lt; {} product&gt;]

我试图添加

@XmlElementWrapper(name="product")

@XmlElement(type = Product.class, name = "product")

@org.jboss.resteasy.annotations.providers.jaxb.Wrapped(element = "product")

但两者都没有帮助。

我该如何解决这个问题?我不想创建额外的bean类。

1 个答案:

答案 0 :(得分:0)

RestEasy客户期望的是:

  [{"product":{"id":1,"name":"EAP","note":null,"extIdJira":null,"extIdBugzilla":"226"}]

  {"products":[{"id":1,"name":"EAP","note":null,"extIdJira":null,"extIdBugzilla":"226"}]}

所以我最终改变了制作方法:

public List<ProductWrapper> getProducts( @Context SecurityContext sc ) {
    final List<Product> prods = daoProd.getProducts_orderName(0);
    return rewrap(prods);
}

private List<ProductWrapper> rewrap(List<Product> prods) {
    List<ProductWrapper> p2 = new ArrayList(prods.size());
    for( Product product : prods){
        p2.add( new ProductWrapper(product));
    }
    return p2;
}