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

Arj*_*jms 15 java jax-rs jaxb resteasy

我在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>
Run Code Online (Sandbox Code Playgroud)

此XML由以下内容生成:

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

    @GET
    @Path("myitems")
    public List<Item> getMyItems() {
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

   <item>
     <description>tv</description>
     <price>1500</price>
   </item>
</items>
Run Code Online (Sandbox Code Playgroud)

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

是否可以轻松指定集合的​​根标签名称?

Arj*_*jms 9

似乎是RTFM的案例:RestEasy docs - JAXB对象的数组和集合

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

<foo:list xmlns:foo="http://foo.org">
    <customer><name>bill</name></customer>
    <customer><name>monica</name></customer>
</foo:list>
Run Code Online (Sandbox Code Playgroud)

我们将使用@Wrapped注释,如下所示:

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

因此可以通过@Wrapped注释.这是一个RESTEasy特定的,但现在这样做.

如果某人有更好的解决方案(仍在寻找让RESTEasy做泽西所做的全局拦截器orso),请保持打开问题.

  • 想想那个更好的解决方案会是什么样子,然后尝试将它包含在下一版本的JAX-RS规范中? (2认同)