web-dev-qa-db-ja.com

WebServices:ベアvsラップ?

既存のwsdlからいくつかのWebサービスを生成します

私はこれを行うためにMavenを使用していますが、一部のWebサービスは

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

と他の

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

Jaxbまたはxjcはこれを自動的に行いますか?私はwsdlsに違いがないので...

18
Cris

BARE Webサービスは、「操作」名、「メッセージ」名、および「要素」名が何らかの形または形式で異なる場合に生成されます。クライアントまたはサービススタブをWRAPPEDとして自動生成するには、これら3つの要素がすべて同じである必要があります。

これに対する回避策は、独自のスタブを作成し、@ RequestWrapper/@ResponseWrapperアノテーションを使用することです。

PS:すべてのportType操作には、「ラップされた」スタイルの要求/応答が必要です。わずかな偏差でさえ、デフォルトでベアになります。

27
lonewolf

このディスカッション 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によって「ラップ」されました。

お役に立てれば!

19

WSDLコントラクトのメッセージパーツに対応するメソッドパラメーターをSOAPメッセージ本文に配置する方法を指定します。BAREのパラメータースタイルは、各パラメーターがメッセージ本文にメッセージルートの子要素。WRAPPEDのパラメータースタイルは、すべての入力パラメーターが要求メッセージで単一の要素にラップされ、すべての出力パラメーターが応答メッセージで単一の要素にラップされることを意味します。 RPCのスタイルには、WRAPPEDパラメータースタイルを使用する必要があります。

参照 http://cxf.Apache.org/docs/developing-a-service.html

2
Yukti Kaura

名前が示すように、「ParameterStyle」は、メソッド呼び出しでパラメーターを渡したり取得したりする構文を変更します。また、公開されたサービスやクライアント/サービス間で交換されるペイロードに違いをもたらすことなく、wsimportによって生成されたクライアント側のアーティファクトに違いをもたらします。 wsimportでBAREを使用すると、次のコードが生成されます。

public int add(int num1, int num2)

しかし、wsimportでWRAPPEDを使用する場合、

public void add(int num1, int num2, Holder result)

が生成されます。そして、これは初期のDCE/RPC時代から採用されています。

0
Muhammad Tayyab