既存のwsdlからいくつかのWebサービスを生成します
私はこれを行うためにMavenを使用していますが、一部のWebサービスは
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
と他の
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
Jaxbまたはxjcはこれを自動的に行いますか?私はwsdlsに違いがないので...
BARE Webサービスは、「操作」名、「メッセージ」名、および「要素」名が何らかの形または形式で異なる場合に生成されます。クライアントまたはサービススタブをWRAPPEDとして自動生成するには、これら3つの要素がすべて同じである必要があります。
これに対する回避策は、独自のスタブを作成し、@ RequestWrapper/@ResponseWrapperアノテーションを使用することです。
PS:すべてのportType操作には、「ラップされた」スタイルの要求/応答が必要です。わずかな偏差でさえ、デフォルトでベアになります。
このディスカッション at Java Ranch Forumがクリアしました。具体的には、この例はJason Irwin::
[〜#〜] bare [〜#〜]クライアント生成インターフェース(wsimportを使用):
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface IMathServer {
@WebMethod
@WebResult(name = "addNumsResponse")
public AddNumsResponse addNums(@WebParam(name = "addNums") AddNums parameters);
}
[〜#〜] wrapped [〜#〜]クライアント生成インターフェース(wsimportを使用):
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface IMathServer {
@WebMethod
@WebResult(name = "addNumsResponse")
public int addNums(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2);
}
この両方のコードは同じメッセージを生成します。
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:addNums xmlns:ns2="http://SoapStyles/">
<num1>1</num1>
<num2>2</num2>
</ns2:addNums>
</S:Body>
</S:Envelope>
R Sriniで述べたように、ラップされるのはパラメーターではなくコードです。
クライアントを生成する唯一の違いは、クライアントでパラメーターを作成する方法ですが、どちらもサービスのWSDLに応じて同じメッセージ(ラップまたはアンラップ)を生成します。
BAREを使用すると、内部に「サブパラメータ」を持つ最上位の要素(パラメータ)のみが存在します。この1つのBAREは直接送信されます(「ラップ」せずに)。 WRAPPEDを使用すると、このすべての「サブパラメーター」が最初のレベルにあり、クライアントはそれらを別の最上位要素に自動的にラップします。
Jason Irwinの引用:
渡されたパラメーターは1つだけ( "addNums")で、本文は "Bare"でした。 2番目の例では、パラメーターはコード内で「ベア」でしたが、実行時にJAX-WSによって「ラップ」されました。
お役に立てれば!
WSDLコントラクトのメッセージパーツに対応するメソッドパラメーターをSOAPメッセージ本文に配置する方法を指定します。BAREのパラメータースタイルは、各パラメーターがメッセージ本文にメッセージルートの子要素。WRAPPEDのパラメータースタイルは、すべての入力パラメーターが要求メッセージで単一の要素にラップされ、すべての出力パラメーターが応答メッセージで単一の要素にラップされることを意味します。 RPCのスタイルには、WRAPPEDパラメータースタイルを使用する必要があります。
名前が示すように、「ParameterStyle」は、メソッド呼び出しでパラメーターを渡したり取得したりする構文を変更します。また、公開されたサービスやクライアント/サービス間で交換されるペイロードに違いをもたらすことなく、wsimportによって生成されたクライアント側のアーティファクトに違いをもたらします。 wsimportでBAREを使用すると、次のコードが生成されます。
public int add(int num1, int num2)
しかし、wsimportでWRAPPEDを使用する場合、
public void add(int num1, int num2, Holder result)
が生成されます。そして、これは初期のDCE/RPC時代から採用されています。