0

我正在尝试为 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; 列号:0;意外元素(uri:“”,本地:“id”)。预期元素是 <{}product>]

我试图添加

@XmlElementWrapper(name="product")

或者

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

或者

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

但两者都没有帮助。

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

4

1 回答 1

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;
}
于 2013-02-08T11:00:00.423 回答