5

我有许多使用 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;

...
...
...

}

如果我创建一个返回单个工件对象的 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”——Artifacts。

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

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

非常感谢,

詹姆士

4

2 回答 2

9

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

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

会产生

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

有关此功能,请参阅JAXB 教程

于 2009-10-09T21:51:51.520 回答
5

好的 - 我收到了来自 Java Jersey 社区领袖 - Paul Sandoz 的更新。这目前是 Jersey 框架的一个未解决问题,在未来的更新中修复之前,我们将不得不解决或接受一些问题。

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

希望这可以帮助。

问候,

詹姆士

于 2009-10-13T08:59:42.740 回答