1

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>

しかし、クラス ファイルを再生成して驚いたことに、すべての固定要素が定数になりました。ゲッター/セッターが生成されなくなりました。しかし残念なことに、選択の問題は残っています。

4

1 に答える 1

0

どうやら私は古いドキュメントを読んでいたようです。私がしなければならなかったのは、バインディング ファイルの jaxb:globalBindings に以下の属性を追加することだけでした。

古いドキュメントでは、これらの属性について言及されていませんでした。

<jaxb:globalBindings fixedAttributeAsConstantProperty="true" choiceContentProperty="true">

これらの属性により、xml 内のすべての固定属性が列挙型になり、xml 内のすべての選択要素がコードで (xxxOrxxxOrxxx 形式で) より適切に生成されるようになりました。

于 2013-08-02T08:56:08.557 に答える