代码之家  ›  专栏  ›  技术社区  ›  Michael Oryl

Jersey 2(JAXB)XML元素案例,列表不支持XmlRootElement

  •  3
  • Michael Oryl  · 技术社区  · 11 年前

    我们刚刚将一项服务从Jersey 1.x升级到2.10.x,并看到了一些意外的行为。我们有一个这样的类,它被注释为封送为“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;
    }
    

    当我们有一个返回用户列表的资源方法时,我们得到的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 1.x中,我们通过在web.xml中放入以下config属性来处理这个Jersey错误:

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

    但这似乎对Jersey 2.x没有任何影响,而且我们找不到一个新的属性来给出相同的结果。显然,我们可以返回一个名为Users的正确注释对象,该对象包含一个User列表,并获得所需的结果,但我们不必在Jersey 1.x中这样做。

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

    1 回复  |  直到 11 年前
        1
  •  2
  •   Matthew Payne    11 年前

    在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中由Jersey 1.x中的com.sun.Jersey.config.feature.XmlRootElementProcessing解决的问题。

    它是 documented here .