JAX-WS と wsimport を使用して、特定の Web サービスを使用する Java アプリケーションを作成しようとしています。サービスに送信される SOAP メッセージは、ほとんど正しいものです。ただし、サービス関数に渡されるパラメーターの 1 つは文字列の配列です。配列自体には SOAP XML で適切な名前空間が与えられていますが、要素 (以下のメッセージの「parm」) には名前空間がありません。これにより、サービスが失敗します。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:Submit xmlns:ns2="http://www.acme.com/service/wsdl">
<ns2:service>SomeJob</ns2:service>
<ns2:parms>
<parm>someparam</parm>
<parm>anotherparam</parm>
</ns2:parms>
</ns2:Submit>
</S:Body>
</S:Envelope>
<parm>
要素は を読んでいる必要があります。<ns2:parm>
または、代わりに、<Submit>
タグでデフォルトの名前空間を定義することもできます<Submit xmlns="http://www.acme.com/service/wsdl">
(これは、SOAP メッセージの例でサービスが示唆しているものです)。
この質問は JAX-WS の質問に似ています: なぜネストされた要素は "" 名前空間にあるのですか? . ただし、スタイルを RPC/Literal から Document/Wrapped に変更すると問題は解決しましたが、私の場合、サービスは最初は Document/Wrapped です。
配列内のネストされた要素に名前空間を生成するように JAX-WS ライブラリを説得するにはどうすればよいですか?
TIA、ジェロン
更新: 生成されたコードの編集は機能しているようです。誰かが、生成された配列型の「parm」の定義に先行する @XmlElement 行に名前空間属性を追加することを提案しました。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfString", propOrder = {
"parm"
})
public class ArrayOfString {
@XmlElement(nillable = true, namespace="http://www.acme.com/service/wsdl")
protected List<String> parm;
...
}
これにより、JAX-WS が名前空間を追加し、おそらく問題が解決します。この場合、コード生成は 1 回だけ実行されるため、生成されたコードの編集は許容されます。それでも、より良い解決策がないかどうか疑問に思います。