CXF を使用して、サードパーティの wsdl から Java コードを生成します (私たちが管理していません)。
SOAP メッセージにマーシャリングするときに、この 2 つのスニペットが期待どおりに機能しません。
XML:
<choice>
<sequence>
<element name="x" type="xt" nillable="true" minOccurs="0" />
</sequence>
<element name="y" type="yt"
nillable="true" minOccurs="0" />
</choice>
Java:
@XmlElement(name = "x", nillable = true)
protected Xx;
@XmlElement(name = "y", nillable = true)
protected Y y;
y ではなく x を SOAP メッセージに (コードを介して) 追加すると、次のようになります。
<x>123456782</x>
<y xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
オプションの要素であるのに、なぜ石鹸メッセージに y を追加するのですか?
このスニペットでも同様のことが起こっています。
XML:
<attribute ref="z" use="required" fixed="XXX" />
Java:
@XmlAttribute(name = "z", namespace = "http://www.egem.nl/StUF/StUF0301",
required = true)
protected String z;
ここで、コードを介して要素を追加しないと、cxf (スキーマ検証が true の場合) が文句を言います。スキーマ検証をオフにすると、要素が作成されず、すべて追加されます。
この要素は必須であり、固定属性があります。(コードを介して) 追加しないと作成されないのはなぜですか?
編集: 開発中に、cxf が .package-info.java ファイルを生成していることに気付きました。これにより、名前空間で問題が発生しました。だから私は .package-info.java ファイルの生成を無効にする方法を探していました。その解決策は、pom ファイルの cxf codegen プラグイン -xjc-npa に追加の引数を追加することでした。pom のその部分は次のようになります。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<configuration>
<defaultOptions>
<extraargs>
<extraarg>-xjc-npa</extraarg>
</extraargs>
</defaultOptions>
</configuration>
</plugin>
しかし、クラス ファイルを再生成して驚いたことに、すべての固定要素が定数になりました。ゲッター/セッターが生成されなくなりました。しかし残念なことに、選択の問題は残っています。