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

15

我正在使用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>

而Jersey总是创建包含列表中元素复数形式的名称:

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

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

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

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


稍微相关,尽管从JAXB的角度来看:https://dev59.com/YHE85IYBdhLWcg3wVR-g - Arjan Tijms
1个回答

9

看起来像是一个RTFM案例:RestEasy文档 - JAXB对象的数组和集合

So, if we wanted to output this XML

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

We would use the @Wrapped annotation as follows:

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

通过使用@Wrapped注解,可以实现这一点。这是RESTEasy特有的一个注解,但这暂时能够满足需求。

如果有更好的解决方案,请留下问题开放(仍在寻找一个全局拦截器或者像Jersey那样让RESTEasy做到的方式)。


2
想一想更好的解决方案会是什么样子,然后尝试将其纳入 JAX-RS 规范的下一个版本中? - Tyler
可能像注册自定义类型转换一样,使用一些全局适配器会更好。 - Arjan Tijms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接