6

クラスがあるとしましょう

@XmlType(propOrder = {
        "one",
        "two"
    })

@XmlRootElement(name = "search")
public class Search {

    protected One one;  
    protected Two two;

    //getters & setters
}

このクラスを拡張するクラスが欲しかった

例えば

@XmlType(propOrder = {
        "three"
    })

@XmlRootElement(name = "searchExtended")
public class SearchExtended extends Search {

    protected Three three;  
    //getters & setters
}

propOrder を正しく宣言するにはどうすればよいですか。以前にこれを試しましたが、思った順序を使用しませんでした。これは注釈によってどのように処理されますか? /拡張クラス全体でこれをどのように宣言する必要がありますか?

4

1 に答える 1

8

親プロパティは、子プロパティの前に、指定された順序に基づいてマーシャリングされます。propOrder親クラスに で注釈を付けると、親クラスのプロパティを子クラスの に含めることができます@XmlTransient


アップデート

トランシスタントにする方法はありますが、通常どおり使用できますか?

いいえ、クラスを設定@XmlTransientすると、JAXB がマップされていると見なすクラスからそのクラスが削除されます。JAXB がサブクラスのプロパティの前にスーパークラスのプロパティを整列化するのは、XML スキーマの規則に一致させるためです。クラスが対応する XML スキーマでSearchマークされていない場合は、次のようになります。@XmlTransientタイプの要素が有効であるためには、XML スキーマの規則に従ってsearchExtended、サブタイプで定義されたどの要素よりも前にスーパー タイプの要素が出現する必要があります。

  <xs:complexType name="searchExtended">
    <xs:complexContent>
      <xs:extension base="search">
        <xs:sequence>
          <xs:element name="three" type="three" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="search">
    <xs:sequence>
      <xs:element name="one" type="one" minOccurs="0"/>
      <xs:element name="two" type="two" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

次のコードを実行すると、JAXB モデルに対応する XML スキーマを確認できます。

import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(SearchExtended.class);
        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }

        });
    }

}
于 2012-09-18T10:52:32.557 に答える