JAX-WS 和 WSDL 中的 javax.jws.WebParam.name 与 javax.jws.WebParam.partName

Mah*_*aha 5 java soap wsdl web-services jax-ws

我在研究 WSDL 和 JAX-WS 时发现了这一点。当我在JAX-WS中编写服务接口时,如下所示:

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

生成的 WSDL 的message请求声明如下:

<message name="getHelloWorldAsString">
    <part **name="myname"** type="xsd:string"></part>
</message>
Run Code Online (Sandbox Code Playgroud)

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

如果我在服务中根本没有指定@WebParam,则 WSDL 会获取部分名称,而arg0使用生成的服务存根wsimport会获取其声明中的name和。partNamearg0@webParam

如果我在服务类中同时指定namepartNamein ,@WebParam如下所示:

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

生成的 WSDL 的部件名称为mypartname。此外,还使用wsimport​​getmypartnamenameof声明生成服务存根,完全忽略我的 Web 服务中的声明。partName@WebParamname="myname"

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

该链接对它们的描述如下:

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

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

注意:这一切都是通过 RPC 风格的 SOAP 绑定而不是文档风格来完成的。

Daw*_*tel 3

让我们看看规范对此有何说明(JSR-000224 Java API for XML-Based Web Services 2.2 Rev a 3.6.1):

注释javax.jws.WebParam(参见 7.11.4)可以用于指定与 Java 参数相对应的 XML 模式元素声明namewsdl:part如果注释中同时使用name和元素,则必须 将 MUST 用于name 属性,并且注释中的元素将被忽略。partNamejavax.jws.WebParampartNamewsdl:partname

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

<wsdl:part name="myname" element="tns:mynameelement" />
Run Code Online (Sandbox Code Playgroud)

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

无效的 wsdl:操作“getHelloWorldAsString”:它是 rpc 文字操作,消息部分必须引用架构类型声明

WSDL 规范并没有禁止这样做,但WS-I Basic Profile却不允许:

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

name结论:如果指定不同的和 ,没有任何区别partName。这两个字段之所以存在,是因为文档绑定样式使用相同的注释,这样它们更有意义。