我有许多使用Jersey直接编组和解组的JAXB bean.
例如
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Artifact", propOrder = {
"artifactId",
"artifactType",
"contentHash"
})
@XmlSeeAlso({
EmailArtifact.class,
ManagedDocArtifact.class
})
@XmlRootElement(name ="Artifact")
public class Artifact {
protected String artifactId;
protected String artifactType;
protected String contentHash;
...
...
...
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个返回单个工件对象的GET方法.它正确生成XML:
<Artifact>
<artifactId>293289392839283</artifactId>
<artifactType>EMAIL</artifactType>
<contentHash>2837873827322</contentHash>
</Artifact>
Run Code Online (Sandbox Code Playgroud)
在这里,我已经能够成功地控制Artifact元素的名称,使其在开头具有大写"A".
但是,我创建了一个返回工件对象集合的GET方法,我最终得到:
<artifacts>
<Artifact>
<artifactId>293289392839283</artifactId>
<artifactType>EMAIL</artifactType>
<contentHash>2837873827322</contentHash>
</Artifact>
<Artifact>
<artifactId>293289392839283</artifactId>
<artifactType>EMAIL</artifactType>
<contentHash>2837873827322</contentHash>
</Artifact>
</artifacts>
Run Code Online (Sandbox Code Playgroud)
如您所见,集合的外部元素具有小写"A".为了符合我们自己的内部标准,我希望这是一个资本"A" - 文物.
我无法看到在JAXB中可以定义的位置,它实际上是控制它的Jersey框架吗?
我们可以控制为集合生成的元素名称吗?
非常感谢,
詹姆士
尝试使用支持该属性的@XmlElementWrappername:
@XmlElementWrapper(name="ELEMENTS")
@XmlElement(name="ELEMENT")
protected final List<String> elements = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)
会生产
<ELEMENTS>
<ELEMENT>one</ELEMENT>
<ELEMENT>two</ELEMENT>
...
</ELEMENTS>
Run Code Online (Sandbox Code Playgroud)
有关此功能,请参阅JAXB指南.
好的 - 我从Java Jersey社区领导者Paul Sandoz获得了更新.这是目前Jersey框架的一个开放性问题,我们将不得不解决或接受,直到它在未来的更新中得到修复.
上面其中一条评论中解释的解决方法是为每个Web服务方法引入一个新类,该方法返回JAXB注释bean的集合(例如List).这个类实际上是一个只包含一个成员的类 - 一个JAXB bean的List.我们不是在Web服务方法中返回List,而是返回特殊类.因为我们可以控制XML中新类的名称,例如@XmlRootElement(name ="Artifacts"),所以我们可以在短期内解决问题.
希望这可以帮助.
问候,
詹姆士