4

私は WSDL と JAX-WS を掘り下げていましたが、そこでこれに出会いました。次のようにJAX-WSでサービスインターフェースを書くと:

@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld {
    @WebMethod
    @WebResult(name="helloworldstring")
    String getHelloWorldAsString(**@WebParam(name="myname")** String name);
}

生成された WSDL ではmessage、for request が次のように宣言されています。

<message name="getHelloWorldAsString">
    <part **name="myname"** type="xsd:string"></part>
</message>

ユーティリティからクライアント スタブを生成するwsimportと、生成されたサービス クラスは両方ともname" partNamemyname" として取得されます。

サービスでまったく指定しない場合@WebParam、WSDL は一部の名前を取得しますが、arg0使用して生成されたサービス スタブは宣言のとのwsimport両方を取得します。namepartNamearg0@webParam

次のようにサービス クラスでnameとの両方を指定するとpartName、次のようになります。@WebParam

@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld {
    @WebMethod
    @WebResult(name="helloworldstring")
    String getHelloWorldAsString(**@WebParam(name="myname", partName="mypartname")**  String name);
}

生成された WSDL は、パーツ名を として取得しmypartnameます。wsimportまた、 getsとof のmypartname両方の宣言を使用して生成されたサービス スタブも、Web サービスで宣言されたものを完全に無視します。namepartName@WebParamname="myname"

したがって、 のこれら 2 つのプロパティの重要性がわかりません@WebParam。この 2 つのプロパティに異なる値を指定すると、WSDL に反映されるはずです。

このリンクでは、次のように説明されています。

  • name: 生成された WSDL ドキュメントに表示されるパラメータの名前を指定します。RPC バインディングの場合、これはパラメーターを表す wsdl:part の名前です。ドキュメント バインディングの場合、これはパラメータを表す XML 要素のローカル名です。JAX-WS 仕様によると、デフォルトは argN で、N はゼロベースの引数インデックス (つまり、arg0、arg1 など) に置き換えられます。
  • partName: パラメータの wsdl:part 要素の name 属性の値を指定します。このプロパティは、ドキュメント スタイルの SOAP バインディングに使用されます。

しかし、まだそこから多くの理解が得られていません。differentnameとを指定すると、どのような違いが生じるか知りたいと思いますpartName

注: これはすべて、Document スタイルではなく RPC スタイルの SOAP バインディングで行っています。

4

2 に答える 2

2

それについての仕様を見てみましょう ( JSR-000224 Java API for XML-Based Web Services 2.2 Rev a 3.6.1):

注釈( javax.jws.WebParam7.11.4 を参照) を使用して、Java パラメータに対応する XML スキーマ要素の宣言を指定することnameができます。要素と要素wsdl:partの両方が注釈 で使用されている場合、 name 属性にはMUST を使用し、注釈の要素は無視されます。namepartNamejavax.jws.WebParampartNamewsdl:partname

したがって、観察した動作は仕様に従って正しいです。ドキュメント スタイルの場合、2 つの異なる属性が意味をなします<wsdl:types>。次のように、RPC サービスでelementの属性を使用できるかどうか疑問に思っていました。part

<wsdl:part name="myname" element="tns:mynameelement" />

簡単なテストでは、wsimport がエラーで失敗することが示されています。

無効な wsdl: 操作 "getHelloWorldAsString": rpc リテラル操作です。メッセージ部分はスキーマ型宣言を参照する必要があります

WSDL 仕様ではそれが禁止されていませんが、WS-I Basic Profileでは次のように禁止されています。

説明内の wsdl:message には、要素属性を使用する wsdl:parts を含めることができます (ただし、これらの wsdl:parts は、rpc-literal バインディング内の soapbind:body によって参照されません)。

name結論: differentとを指定しても違いはありませんpartName。これらの 2 つのフィールドが存在するのは、ドキュメント バインディング スタイルに同じ注釈が使用されているためです。

于 2013-10-26T17:18:58.820 に答える
1

name はメッセージ名です partName はメッセージの PartName です

   <message **name="name"**>
        <part **name="partname"** type="xsd:string"></part>
    </message>
于 2014-11-25T21:02:23.047 に答える