RESTEasy 返回的集合中的根元素名称

2022-09-03 15:40:39

我在JBoss AS 6中通过RestEasy使用JAX-RS。当我的 JAX-RS 资源返回一组项目时(例如,通过 List),RESTEasy 始终使用该名称作为根元素。collection

例如:

<collection>    
   <item>
     <description>computer</description>
     <price>2500</price>
   </item>

   <item>
     <description>tv</description>
     <price>1500</price>
   </item>
</collection>

此 XML 由以下方式生成:

@Produces("application/xml")
@Path("xml")
@RequestScoped
public class MyResource {

    @GET
    @Path("myitems")
    public List<Item> getMyItems() {
        return ...
    }
}

可以看出,RESTEasy创建的根标签始终是 。<collection>

另一方面,泽西岛始终创建一个名称,该名称是列表中包含的元素的复数形式:

<items>    
   <item>
     <description>computer</description>
     <price>2500</price>
   </item>

   <item>
     <description>tv</description>
     <price>1500</price>
   </item>
</items>

我知道可以创建一个包装器类型并返回该类型而不是List,但这是一个相当复杂的解决方法,并使代码更加复杂。

是否可以轻松地为集合指定根标记的名称?


答案 1

似乎是RTFM的一个案例:RestEasy文档 - JAXB对象的数组和集合

所以,如果我们想输出这个XML

<foo:list xmlns:foo="http://foo.org">
    <customer><name>bill</name></customer>
    <customer><name>monica</name></customer>
</foo:list>

我们将按如下方式使用@Wrapped注释:

@GET
@Path("list")
@Produces("application/xml")
@Wrapped(element="list", namespace="http://foo.org", prefix="foo")
public List<Customer> getCustomerSet() { ... }

因此,可以通过@Wrapped注释来实现。这是一个RESTEasy特定的,但现在这样就可以了。

让问题悬而未决,以防有人有更好的解决方案(仍然在寻找一个全局拦截器,让RESTEasy做泽西岛做的事情)。


答案 2

推荐