2016-04-28 12 views
0

JAXBを使用してXSDからコードを生成しています。 XSDタイプ(classタグ/ implClass属性を使用)のいずれかの実装タイプを定義する外部バインディングファイルがあります。これを行うと、生成されたObjectFactoryが、指定された実装クラスのインスタンスを返すように変更されます。ただし、生成されたクラスは生成された基底型のメンバを宣言します。代わりに、生成されたXSD型参照のすべての使用を実装タイプにするための方法がありますか?次のような例としてJAXBバインディングを実装クラスにグローバルに置き換える

、 "example.xsd" を前提としている:生成するxjcを実行した後

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      schemaLocation="example.xsd" node="/xsd:schema" version="2.1"> 
    <bindings node="./xsd:complexType[@name='MemberType']"> 
    <class implClass="myNamespace.Member" /> 
    </bindings> 
</bindings> 

:次に

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ...> 
    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Member" type="MemberType" maxOccurs="unbounded" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="MemberType" /> 
</xsd:schema> 

、私は次の "bindings.xjb" ファイルを持っています上記のシナリオでは、JAXBクラスの場合、次のメソッドを含むObjectFactoryクラスを取得します。

工場でMemberTypeの実装のインスタンスが正しく生成されています。しかし、生成されたRootクラスの実装が含まれています:

protected List<MemberType> member; 
public List<MemberType> getMember() { 
    if (member == null) { 
     member = new ArrayList<MemberType>(); 
    } 
    return this.member; 
} 

私が代わりに実装ようになります:

protected List<Member> member; 
public List<Member> getMember() { 
    if (member == null) { 
     member = new ArrayList<Member>(); 
    } 
    return this.member; 
} 

は、私は内 myNamespace.MemberMemberTypeを置換することを指定する方法があります」 bingings.xjb "?私はこの構成のために ObjectFactory.createMemberTypeの結果も同様に変化すると期待しています。ありがとう。

答えて

0

多くの試行錯誤の末、私はついにこれを行う方法を発見しました。

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      schemaLocation="example.xsd" node="/xsd:schema" version="2.1"> 
    <bindings node="./xsd:complexType[@name='MemberType']"> 
    <class implClass="myNamespace.Member" /> 
    </bindings> 
    <bindings node="//xsd:element[@name='Member']"> 
    <property name="Members"> 
     <baseType name="myNamespace.Member" /> 
    </property> 
    </bindings> 
</bindings> 

生成ObjectFactory.createMemberType方法が変更されていません:

protected List<myNamespace.Member> members; 
public List<myNamespace.Member> getMembers() { 
    if (members == null) { 
     members = new ArrayList<myNamespace.Member>(); 
    } 
    return this.members; 
} 

public MemberType createMemberType() { 
    return new Member(); 
} 

しかし、生成されたRootクラスは今、次の実装を持って、次は作業 "bindings.xjb" ファイルであります

結果のJAXBオブジェクトがマーシャリングされ、正しくアンマーシャリングされていることを確認しました。

関連する問題