Jersey 2(JAXB)XML元素案例,列表不符合XmlRootElement

时间:2015-02-27 19:59:48

标签: xml jaxb jersey jersey-2.0

我们刚刚将一项服务从Jersey 1.x升级到2.10.x,并且看到了一些意想不到的行为。我们有一个类似这样的课程,注释为编组为' User'而不是'用户':

@XmlRootElement(name = "User", namespace = "security.services.pml.com")
public class User {
    @XmlElement(namespace = "security.services.pml.com", required = true)
    protected String name;
    @XmlElement(namespace = "security.services.pml.com", required = true)
    protected String nickname;
}

当我们有一个返回用户列表的资源方法时,我们使用以下格式获取XML(注意小写"用户"父元素):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<users>
    <User xmlns="security.services.pml.com">
        <name>John Doe</name>
        <nickname>Jackie</nickname>
    </User>
</users>

我们希望Jersey改为将用户(来自注释)复数以提出用户而不是用户

在Jersey 1.x中,我们通过将以下配置属性放入我们的web.xml来处理这个Jersey错误:

<init-param>
    <param-name>com.sun.jersey.config.feature.XmlRootElementProcessing</param-name>
    <param-value>true</param-value>
</init-param>

但这似乎对泽西岛2.x没有影响,我们无法找到一个新的属性来给出相同的结果。我们显然可以返回一个名为Users的正确注释对象,其中包含User列表并获得所需结果,但我们不必使用Jersey 1.x。

有人知道我们缺少什么吗?

1 个答案:

答案 0 :(得分:2)

在servlet定义中,在web.xml中,新属性名称为:

 <init-param>
      <param-name>jersey.config.jaxb.collections.processXmlRootElement</param-name>
      <param-value>true</param-value>
 </init-param>

如果在代码中设置,则为:

       .property("jersey.config.jaxb.collections.processXmlRootElement", true);

请参阅:Jersey 2 Constants 哪个链接指向MessageProperties constant JAXB_PROCESS_XML_ROOT_ELEMENT

这解决了Jersey 2.x中由com.sun.jersey.config.feature.XmlRootElementProcessing在Jersey 1.x中解决的问题。

documented here