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实用程序生成客户端存根时,生成的服务类同时获取name和partName作为“myname”。
如果我在服务中根本没有指定@WebParam,则 WSDL 会获取部分名称,而arg0使用生成的服务存根wsimport会获取其声明中的name和。partNamearg0@webParam
如果我在服务类中同时指定name和partNamein ,@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。此外,还使用wsimportgetmypartname和nameof声明生成服务存根,完全忽略我的 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 绑定而不是文档风格来完成的。
让我们看看规范对此有何说明(JSR-000224 Java API for XML-Based Web Services 2.2 Rev a 3.6.1):
注释
javax.jws.WebParam(参见 7.11.4)可以用于指定与 Java 参数相对应的 XML 模式元素声明name。wsdl: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。这两个字段之所以存在,是因为文档绑定样式使用相同的注释,这样它们更有意义。
| 归档时间: |
|
| 查看次数: |
9394 次 |
| 最近记录: |