我在使用XJC从XSD生成具有适当JAXB注释的Java类时遇到一些问题.
我有一个相对简单的XSD文件来定义我的XML模式.XSD中的复杂类型利用<xs:extension>
标记继承.我遇到的问题是我需要所有复杂的类型来生成Java类@XmlRootElement
.
不幸的是,XJC生成类的方式意味着只有派生类才能获得@XmlRootElement
(而不是基类).我使用简单的全局绑定指令来确保它解决了我在XJC面临的许多其他问题.
以下是XSD的示例代码段:
<xs:schema version="1.0" targetNamespace="http://www.knowledgemill.com/kmcs"
xmlns:kmcs="http://www.knowledgemill.com/kmcs"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
elementFormDefault="qualified">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:simple />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
<xs:element name="Artifact" type="kmcs:Artifact"/>
<xs:element name="EmailArtifact" type="kmcs:EmailArtifact"/>
<xs:complexType name="Artifact">
<xs:sequence>
<xs:element name="artifactId" type="xs:string" minOccurs="0"/>
<xs:element name="artifactType" type="xs:string" minOccurs="0"/>
<xs:element name="contentHash" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EmailArtifact">
<xs:complexContent>
<xs:extension base="kmcs:Artifact">
<xs:sequence>
<xs:element name="subject" type="xs:string" minOccurs="0"/>
<xs:element name="threadSubject" type="xs:string" minOccurs="0"/>
<xs:element name="from" type="xs:string" minOccurs="0"/>
<xs:element name="to" type="xs:string" minOccurs="0"/>
<xs:element name="cc" type="xs:string" minOccurs="0"/>
<xs:element name="bcc" type="xs:string" …
Run Code Online (Sandbox Code Playgroud) 我有许多使用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框架吗?
我们可以控制为集合生成的元素名称吗?
非常感谢,
詹姆士