JAXB集合(List <t>)使用Pascal Case而不是Camel Case作为元素名称</t>

时间:2009-10-09 17:14:26

标签: java jaxb jersey

我有许多使用Jersey直接编组和解组的JAXB bean。

E.g。

@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;

...
...
...

}

如果我创建一个返回单个工件对象的GET方法。它正确生成XML:

<Artifact>
 <artifactId>293289392839283</artifactId>
 <artifactType>EMAIL</artifactType>
 <contentHash>2837873827322</contentHash>
</Artifact>

在这里,我能够成功地控制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>

如您所见,集合的外部元素具有小写“A”。为了符合我们自己的内部标准,我希望这是一个资本“A” - 文物。

我无法看到在JAXB中可以定义的位置,它实际上是控制它的Jersey框架吗?

我们可以控制为集合生成的元素名称吗?

非常感谢,

詹姆斯

2 个答案:

答案 0 :(得分:9)

尝试使用支持name属性的@XmlElementWrapper

@XmlElementWrapper(name="ELEMENTS")
@XmlElement(name="ELEMENT")
protected final List<String> elements = new LinkedList<String>();

将产生

<ELEMENTS>
  <ELEMENT>one</ELEMENT>
  <ELEMENT>two</ELEMENT>
  ...
</ELEMENTS>

有关此功能,请参阅JAXB Tutorial

答案 1 :(得分:5)

好的 - 我从Java Jersey社区负责人Paul Sandoz获得了更新。这是目前Jersey框架的一个开放性问题,我们将不得不解决或接受,直到它在未来的更新中得到修复。

上述评论之一中解释的解决方法是为每个Web服务方法引入一个新类,该方法返回JAXB注释bean的集合(例如List)。这个类实际上是一个只包含一个成员的类 - 一个JAXB bean的List。我们不是在Web服务方法中返回List,而是返回特殊类。因为我们可以控制XML中新类的名称,例如@XmlRootElement(name =“Artifacts”)我们可以在短期内解决问题。

希望这会有所帮助。

问候,

詹姆斯