仕事でWebサービスを呼び出すJavaアプリケーションに前方互換性を追加しようとしていますが、JAXBはこの件に関して後方に動作しているようです...
アプリケーションはwsdl2java
Maven プラグインを使用して、WSDL から CXF Web サービス クライアントを生成します。次に、その生成されたクライアントを使用して、(SOAP over JMS を介して) Web サービスと通信します。Web サービスが呼び出しへの応答で不明な要素を送信すると、JAXB は「予期しない要素」エラーで失敗します。これは理解でき、XML に準拠しています。上位互換性を高めるために、これらの特定のエラーを無視するカスタムを指定してjaxb-reader-validation-event-handler
、問題を解決しました。
しかし、いくつかの補完的なテストを行っているときに、XML に準拠していない動作を発見しました。
まず、JAXB は要素の順序を気にしませんsequence
。これは XML に準拠していませんが、前方互換性には適しています。
ただし、必須要素 ( ) が存在しない場合も気にせずminOccurs="1"
、任意のデフォルト値 (つまり、Java プリミティブ値にバインドされた要素のデフォルト値、int
! の 0 など) を親切に割り当てます。
これは XML に準拠しておらず、互換性にも適していません。たとえば、必須の価格が整数として必要であるが、何らかの理由で Web サービスがそれを提供しない場合、JAXB は警告なしでそれに値 0 を割り当てます。 、デバッグが本当に難しくなります。
どうやら、JAXB が要素に遭遇しない場合、単にそのセッターを呼び出さないためです。つまり、デフォルト値を保持します。
[編集: いくつかの補完的なテストを行いました。アプリケーションが 1 つの要素 ( maxOccurs="1"
) を期待しているのに、Web サービスが 2 つを送信する場合、JAXB は同じセッターを 2 回呼び出し、最初の値を 2 番目の値でオーバーライドします。そのため、クライアントが生成されると、 WSDL から、minOccurs
単にmaxOccurs
無視されます...]
必須要素が欠落しているときに JAXB を失敗させるにはどうすればよいですか?
minOccurs="1"
を含む要素であっても、対応する生成された属性の注釈には が含まれていないことに気付きましたrequired = true
。生成後、アプリケーションを起動する前に手動で追加しようとしましたが、成功しませんでした:単に無視されているようです...