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 messagefor request 声明如下:

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

当我从wsimport实用程序生成客户端存根时,生成的服务类同时获取namepartName作为“myname”。

如果我@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. 此外,使用wsimportgetsmypartname和声明生成的服务存根,完全忽略了我的webservice 中声明的。namepartName@WebParamname="myname"

所以我不明白这两个属性的意义@WebParam。如果我在这两个属性中指定不同的值,应该在 WSDL 中反映什么。

此链接将它们描述如下:

  • name:指定出现在生成的 WSDL 文档中的参数名称。对于 RPC 绑定,这是表示参数的 wsdl:part 的名称。对于文档绑定,这是表示参数的 XML 元素的本地名称。根据 JAX-WS 规范,默认值为 argN,其中 N 替换为从零开始的参数索引(即 arg0、arg1 等)。
  • partName: 指定参数的 wsdl:part 元素的 name 属性的值。此属性用于文档样式 SOAP 绑定。

但仍然没有从中得到太多的理解。想知道如果我指定不同的nameand会有什么不同partName

注意:这一切都是使用 RPC 样式的 SOAP 绑定而不是文档样式来完成的。

4

2 回答 2

2

让我们看看规范是怎么说的(JSR-000224 Java API for XML-Based Web Services 2.2 Rev a 3.6.1):

javax.jws.WebParam注释(参见 7.11.4)可以用于指定对应于 Java 参数name的XML Schema 元素声明。wsdl:part如果注解 中同时使用了namepartName元素,则必须将其用于name 属性,并且注解中的元素将被忽略。javax.jws.WebParampartNamewsdl:partname

因此,根据规范,您观察到的行为是正确的。在 Document 样式的情况下,两个不同的属性是有意义的,因为在<wsdl:types>. 我想知道是否可以在 RPC 服务中使用element属性,如下所示:part

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

简短的测试表明 wsimport 失败并出现错误:

Invalid wsdl:operation "getHelloWorldAsString": 它是一个 rpc-literal 操作,消息部分必须引用一个模式类型声明

WSDL 规范不允许这样做,但WS-I Basic Profile允许:

描述中的 wsdl:message 可以包含使用 elements 属性的 wsdl:parts,前提是这些 wsdl:parts 在 rpc-literal 绑定中没有被 soapbind:body 引用。

结论:如果您指定不同的nameand并没有任何区别partName。这两个字段在那里是因为相同的注释用于文档绑定样式,它们更有意义。

于 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 回答