2012-11-16 11 views
5
<ProductInformation Context="GL"> 
<Assets> 
    <Asset ID="assetID" UserTypeID="ID"> 
    <Name>name</Name> 
    <Reference ClassificationID="id"/> 
     <Values> 
     <Value AttributeID="ID">Value1</Value> 
     <Value AttributeID="ID">Value2</Value> 
      <MultiValue AttributeID="attributeID"> 
      <Value>value3a</Value> 
      <Value>value3b</Value> 
      </MultiValue> 
    </Values> 
    </Asset> 
</Assets> 

<Products>....</Products> 

</ProductInformation> 

私はこのxml-> xsdとxjcを使ってクラスを作成しました。marshall with xjc created nested classes

今、私はProductInformationオブジェクトを作成してマーシャルしたいと思います。

私の問題は、xjcがProductInformation内に3つのクラスとobjectfactory、およびいくつかのネストされたクラスを作成することです。使用可能なメソッドを見ると、私はセッターの代わりにゲッターをほとんど見ます。

「資産」クラスには次のようなメソッドはありません。

asset.setValues(List<Value> values) 

また、このような面白いコードを書くことになりました。

ProductInformation.Assets.Asset.Values.MultiValue multivalue=new ProductInformation.Assets.Asset.Values.MultiValue(); 

これはJaxbでは正常ですか?

+0

あなたが問題を起こし、生成されたコードの特定の部分を投稿することができますか?通常はすべて正常に動作するはずです... – Puce

答えて

5

JAXBが通常複数の値を持つプロパティを処理する方法は、可変リストを返すList<Whatever>のgetterとsetterを提供することです。ゲッターを呼び出して最初は空のリストを取得し、このリストのメンバーオブジェクトは、通常の方法でnewを使用し、addを直接リストに追加します。 new静的ネストされたクラスは、トップレベルのものとまったく同じ方法で行うことができます。

getterとsetterの両方で単一値プロパティ(リストではない)が生成されているはずです。

+0

ありがとう!私はそれをチェックします、質問を更新しました – Spring

+0

私の資産クラスがProductInfo内の内部静的であることを奇妙ではないことを確認できますか? – Spring

+0

@Springはい、そのスクリーンショットは正しいように見えますが、これはJAXBがデフォルトで生成するものと思われます。 –

3

answer given by Ian Robertsが正しいです。私はこれを与えて、内部クラスを持たないことに関心のある人々のためにいくつかの追加情報を提供しています。

XMLスキーマ(schema.xsd)

それぞれ独自の定義が含まれているため、JAXBクラスは、以下のXMLスキーマから生成され、両方の結果CustomerEmployeeクラスは(Addressという静的ネストされたクラスが含まれますアドレスの)。これは実際に静的ネストされたクラスが名前の競合の問題を避けるために使用される理由です。バインディングファイルがJava生成にスキーマをカスタマイズするために使用される

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema 
    targetNamespace="http://www.example.org/company" 
    xmlns="http://www.example.org/company" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"> 

    <xsd:element name="customer"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="address"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="street" type="xsd:string"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="employee"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="address"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="road" type="xsd:string"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

JAXBバインディングファイル(binding.xml)。 localScoping="top-level"ですべてがトップレベルクラスであることを指定できます。これを行うときには、潜在的な名前の競合を解決する必要があります。

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:globalBindings localScoping="toplevel"/> 
    <jaxb:bindings schemaLocation="company.xsd"> 
     <jaxb:bindings node="//xsd:element[@name='employee']/xsd:complexType/xsd:sequence/xsd:element[@name='address']/xsd:complexType"> 
      <jaxb:class name="EmployeeAddress"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

XJCコール以下

は、XMLスキーマからJavaクラスを生成するために、XJCコマンドを使用するときにバインディングファイルを指定する例です。詳細情報

xjc -b binding.xml schema.xsd