【问题标题】:javax.jws.WebParam.name vs javax.jws.WebParam.partName in JAX-WS and WSDLJAX-WS 和 WSDL 中的 javax.jws.WebParam.name 与 javax.jws.WebParam.partName
【发布时间】:2013-11-05 13:35:12
【问题描述】:

我正在研究 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 请求声明如下:

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

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

如果我在我的服务中根本没有指定 @WebParam,则 WSDL 的部件名称为 arg0,而使用 wsimport 生成的服务存根在其 @ 中同时获得 namepartName 作为 arg0 987654334@声明。

如果我在服务类的@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。对于@WebParam 声明中的namepartName,使用wsimport 生成的服务存根也得到mypartname,完全忽略在我的Web 服务中声明的name="myname"

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

This link 对它们的描述如下:

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

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

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

【问题讨论】:

    标签: java web-services soap wsdl jax-ws


    【解决方案1】:

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

    javax.jws.WebParam 注释(参见 7.11.4)可以用于 指定wsdl:partname 或对应于Java 参数的XML Schema 元素声明。如果namepartName 元素都在javax.jws.WebParam 注释中使用,则 partName 必须用于 wsdl:part 名称属性和注释中的 name 元素 将被忽略。

    因此,根据规范,您观察到的行为是正确的。在 Document 样式的情况下,两个不同的属性是有意义的,因为您在 &lt;wsdl:types&gt; 中同时拥有部件名称和元素名称。我想知道是否可以在 RPC 服务中使用partelement 属性,如下所示:

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

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

    无效的wsdl:操作“getHelloWorldAsString”:它是一个rpc-literal操作,消息部分必须引用一个模式类型声明

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

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

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

    【讨论】:

      【解决方案2】:

      name 用于消息名称 partName 是 Message 的 PartName

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多