web-dev-qa-db-ja.com

XSDでベースタイプの@XmlRootElementクラスを生成する方法

XJCを使用してXSDからJava適切なJAXBアノテーションを持つクラスを生成することで、いくつかの問題があります。

XMLスキーマを定義する比較的単純なXSDファイルがあります。 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" 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>

上記のスニペットからわかるように、EmailArtifactArtifactを拡張します。

Java EmailArtifactのクラスコード)には以下が含まれます。

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

Java Artifactのクラスコード)には以下が含まれます。

@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が含まれていないことがわかります。

XJCに、基本タイプを含むすべてのクラスの@XmlRootElementを生成させるにはどうすればよいですか。

25
jallch

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>

そして、同じタイプの要素を定義することを忘れないでください:

<xs:complexType name="Artifact" />
<xs:element name="artifact" type="Artifact">
30
Azee

この 質問 は、以前はJAX-BまたはJAX-WS RIで作業していた川口浩介による ブログ の参照を参照しており、RIの意思決定プロセスと明確さの欠如について語っています。仕様のこの問題。

ブログの投稿では、シンプルなバインディング機能はRIの一部であると述べています。コードを生成するためにRIを使用していますか?

3
DavidValeri