gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:39:10 27 4
gpt4 key购买 nike

我正在研究 WSDL 和 JAX-WS,这就是我遇到这个问题的地方。当我在 JAX-WS 中编写服务接口(interface)时,如下所示:

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

生成的 WSDL 具有如下声明的请求的消息:

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

当我从 wsimport 实用程序生成客户端 stub 时,生成的服务类将 namepartName 作为“myname”。

如果我在我的服务中根本没有指定 @WebParam,则 WSDL 的部分名称为 arg0,而服务 stub 是使用 wsimport 生成的在其 @webParam 声明中获取 namepartName 作为 arg0

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

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

生成的 WSDL 的部件名称为 mypartname。此外,使用 wsimport 生成的服务 stub 为 @WebParamnamepartName 获取 mypartname > 声明,完全忽略在我的网络服务中声明的 name="myname"

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

This link描述如下:

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

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

注意:所有这些都是使用 RPC 样式的 SOAP 绑定(bind)而不是文档样式来完成的。

最佳答案

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

The javax.jws.WebParam annotation (see 7.11.4) MAY be used to specify the name of the wsdl:part or XML Schema element declaration corresponding to a Java parameter. If both the name and partName elements are used in the javax.jws.WebParam annotation then the partName MUST be used for the wsdl:part name attribute and the name element from the annotation will be ignored.

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

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

简短测试显示 wsimport 失败并出现错误:

Invalid wsdl:operation "getHelloWorldAsString": its a rpc-literal operation, message part must refer to a schema type declaration

WSDL 规范并没有禁止,但是WS-I Basic Profile做:

A wsdl:message in a DESCRIPTION MAY contain wsdl:parts that use the elements attribute provided those wsdl:parts are not referred to by a soapbind:body in an rpc-literal binding.

结论:指定不同的name没有任何区别和 partName .这两个字段在那里是因为相同的注释用于文档绑定(bind)样式,它们更有意义。

关于JAX-WS 和 WSDL 中的 javax.jws.WebParam.name 与 javax.jws.WebParam.partName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com