如何为 XSD 中的基本类型生成 @XmlRootElement 类? [英] How to generate @XmlRootElement Classes for Base Types in XSD?
问题描述
我在使用 XJC 从 XSD 生成带有适当 JAXB 注释的 Java 类时遇到了一些问题.
I am having some issues with generating Java Classes with appropriate JAXB annotations from an XSD using XJC.
我有一个相对简单的 XSD 文件来定义我的 XML 架构.XSD 中的复杂类型使用
标签利用继承.我遇到的问题是我需要所有复杂类型来生成带有 @XmlRootElement
的 Java 类.
I have a relatively simple XSD file defining my XML schema. The complex types within the XSD take advantage of inheritance using the <xs:extension>
tags. The problem I having is that I need all complex types to generate Java Classes with the @XmlRootElement
.
不幸的是,XJC 生成类的方式意味着只有派生类才能获得 @XmlRootElement
(而不是基类).我正在使用简单的全局绑定指令来确保它解决了我在 XJC 中遇到的许多其他问题.
Unfortunately, the way in which XJC generates the classes means that only derived class gets the @XmlRootElement
(not the base class). I am using the simple global binding directive to ensure that it solves many of the other issues that I have faced with XJC.
这是 XSD 的示例片段:
Here is an example snippet of the 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" minOccurs="0"/>
<xs:element name="messageId" type="xs:string" minOccurs="0"/>
<xs:element name="date" type="xs:date" minOccurs="0"/>
<xs:element name="size" type="xs:long" minOccurs="0"/>
<xs:element name="hasAttachment" type="xs:boolean" minOccurs="0"/>
<xs:element name="sensitivity" type="xs:string" minOccurs="0"/>
<xs:element name="headerHash" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
从上面的代码片段可以看出,EmailArtifact
扩展了 Artifact
.
As we can see from the above snippet, EmailArtifact
extends Artifact
.
EmailArtifact
的 java 类代码包含以下内容:
The java class code for EmailArtifact
contains the following:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EmailArtifact", propOrder = {
"subject",
"threadSubject",
"from",
"to",
"cc",
"bcc",
"messageId",
"date",
"size",
"hasAttachment",
"sensitivity",
"headerHash"
})
@XmlSeeAlso({
ExtendedEmail.class
})
@XmlRootElement(name = "EmailArtifact")
public class EmailArtifact
extends Artifact
{
protected String subject;
protected String threadSubject;
protected String from;
protected String to;
protected String cc;
protected String bcc;
protected String messageId;
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
protected Long size;
protected Boolean hasAttachment;
protected String sensitivity;
protected String headerHash;
Artifact
的 java 类代码包含以下内容:
The java class code for Artifact
contains the following:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Artifact", propOrder = {
"artifactId",
"artifactType",
"contentHash"
})
@XmlSeeAlso({
ManagedDocArtifact.class,
EmailArtifact.class
})
public class Artifact {
protected String artifactId;
protected String artifactType;
protected String contentHash;
在 EmailArtifact
中我们可以看到它包含 @XmlRootElement
但基本类型 Artifact
不包含 @XmlRootElement代码>.
In the EmailArtifact
we can see that it contains the @XmlRootElement
but the base type Artifact
does not contain @XmlRootElement
.
您如何强制 XJC 为包括基类型在内的所有类生成 @XmlRootElement
.
How can you force XJC to generate @XmlRootElement
for all classes including the base types.
推荐答案
只需使用 xjb-file 绑定:
Just bind using xjb-file:
<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="path/to/myschema.xsd" node="/xs:schema">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
并且不要忘记定义相同类型的元素:
And don't forget to define element of the same type:
<xs:complexType name="Artifact" />
<xs:element name="artifact" type="Artifact">
这篇关于如何为 XSD 中的基本类型生成 @XmlRootElement 类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!