Jersey 2 (JAXB) XML 元素大小写,列表不支持 XmlRootElement

Jersey 2 (JAXB) XML element case with list not honoring XmlRootElement

我们刚刚将一项服务从 Jersey 1.x 升级到 2.10.x,并且发现了一些意外行为。我们有一个像这样的 class 被注释为编组为 'User' 而不是 '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;
}

当我们有一个 return 用户列表的资源方法时,我们得到 XML 具有以下格式(注意小写 "users" 父元素):

<?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 将 User 复数化(来自注释)以提出 Users 而不是 users .

在 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>

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

有人知道我们遗漏了什么吗?

在 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.