我们刚刚将一项服务从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。
有人知道我们缺少什么吗?
答案 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中解决的问题。