7

JAXB はモジュラーコード生成をサポートしていますか?

私のバックグラウンドのほとんどは、XML マーシャリング用の JibX に関するものですが、従来の理由から、当社では JAXB を使用しています。

JIBX で使用できる機能の 1 つは、モジュラー コード生成でした。メイン スキーマがあるとしますが、そのスキーマにはいくつかの異なるエンベロープがあります。JibX を使用すると、JibX で処理されたコア スキーマから jar ファイルを作成でき、別のプロジェクトでエンベロープ スキーマを JibX して、エンベロープごとにコア スキーマのコード生成を複製する代わりに、共有 jar を指すだけで済みます。 .

JAXB がこれを処理する方法はまだわかりません。このようなことで成功した人はいますか?

前もってありがとう、ロイ

4

2 に答える 2

9

JAXB RIの場合、これは「エピソード」ファイルで処理されます (これらは実際には単なるカスタマイズ ファイルです)。最初にコア スキーマを処理し、xjc-episode <file>がargを使用するようにします。その処理の結果を のエピソード ファイルと一緒に JAR ファイルにパッケージ化しますMETA-INF/sun-jaxb.episode。次に、他のスキーマを処理するときに、その JAR ファイルを引数として xjc に渡します。

于 2011-05-03T16:30:11.807 に答える
3

JAXB 2.1 実装 (Metro、EclipseLink MOXy、Apache JaxMe など) を使用すると、スキーマ タイプが既存のクラスに対応するように指定して、それらが生成されないようにすることができます。

例えば:

root.xsd

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root">
    <xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/>
    <xsd:complexType name="root">
        <xsd:attribute name="root-prop" type="xsd:string"/>
    </xsd:complexType>
</xsd:schema>

インポートされた.xsd

<?xml version="1.0"?>
<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.example.com/imported" 
    targetNamespace="http://www.example.com/imported">
    <xsd:complexType name="imported">
        <xsd:attribute name="imported-prop" type="xsd:string"/>
    </xsd:complexType>
</xsd:schema>

問題文

XJC ツールを使用して XML スキーマから Java クラスを生成する場合:

xjc -d out root.xsd

以下が生成されます。

com\example\imported\Imported.java
com\example\imported\ObjectFactory.java
com\example\imported\package-info.java
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java

import-bindings.xml

JAXB バインディング ファイルを使用して、imported.xsd の型が既存のクラスを指すように指定できます。

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="imported.xsd">
            <jxb:bindings node="//xs:complexType[@name='imported']">
                <jxb:class ref="com.example.imported.Imported"/>
            </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

XJC の実行

ここで、バインディング ファイルなしで XJC を実行すると、次のようになります。

xjc -d out -b imported-bindings.xml root.xsd

バインディング ファイルで指定されたファイルは生成されません。

com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java

代替アプローチ

インポートされたスキーマから直接生成されるコード (xjc import.xsd) と間接的に生成されるコード (xjc root.xsd) は同じです。間接的に生成されたコードをドロップして、直接生成されたコードを含むプロジェクトを指定するだけです。

于 2011-05-03T14:04:18.577 に答える