【问题标题】:jax-ws/wsimport generates WebMethod with void return - same Request/ResponseWrapperjax-ws/wsimport 生成带有 void 返回的 WebMethod - 相同的 Request/ResponseWrapper
【发布时间】:2012-04-27 11:37:55
【问题描述】:

我正在使用客户端的 WSDL 文件,该文件对输入和输出消息使用相同的元素定义,但我无法让 JAX-WS/JAXB 解组响应。

<wsdl:message name="invokeServiceRequest">
    <wsdl:part element="impl:requests" name="multiRequestWrapper"/>
</wsdl:message>
<wsdl:message name="invokeServiceResponse">
    <wsdl:part element="impl:requests" name="result"/>
</wsdl:message>
<wsdl:portType name="GCGatewayPortType">
    <wsdl:operation name="requests">
        <wsdl:input message="impl:invokeServiceRequest" name="invokeServiceRequest"/>
        <wsdl:output message="impl:invokeServiceResponse" name="invokeServiceResponse"/>
    </wsdl:operation>
</wsdl:portType>

由于某种原因,wsimport 生成的代码返回 void,并且在收到响应时似乎没有更新 INOUT 参数。

/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.7-b01-
 * Generated source version: 2.1
 */
...
@WebMethod
@RequestWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
@ResponseWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
public void requests(
    @WebParam(name = "paramOne", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<String> paramOne,
    @WebParam(name = "paramTwo", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<String> paramTwo,
    @WebParam(name = "requestList", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<List<RequestType>> requestList);

当我调用port.request( paramOne, paramTwo, requestList ) 时,我可以看到 SOAP 请求被发送到服务器,服务器以有效的 SOAP 响应进行响应:

<soapenv:Envelope ...>
    <soapenv:Header />
    <soapenv:Body>
        <requests ...>
            <paramOne>1</paramOne>
            <paramTwo>2</paramTwo>
            <requestList>
                <!-- various elements that JAXB has generated code for -->

但是,当我在调试模式下运行我的应用程序时,我可以在调试器变量视图中看到每个RequestType 实例,但是因为RequestsType 有一个&lt;xsd:choice&gt;RequestDataResponseData,后者是null 和 RequestData 是我提供的。

我已在其他项目中成功使用 JAX-WS,但在这些情况下,它生成的代码带有 @WebResult 和以 WebResult 命名的非 void 返回类型。在这个项目中,我认为我没有得到 WebResult,因为 JAX-WS 已经决定请求和响应类型是相同的,并且它可以重用相同的对象 - 但是我如何让它使用来自回应?

【问题讨论】:

  • 能否请您发布您的 WSDL 文档?

标签: java soap jax-ws wsimport


【解决方案1】:

我遇到了完全相同的问题。 我尝试了用于各种类型、元素、消息名称、操作名称等的名称。我终于找到了关键,而您在问题中所说的话实际上使我接近答案:

在这个项目中,我认为我没有得到 WebResult,因为 JAX-WS 已经确定请求和响应类型是相同的,并且它可以重用相同的对象 - 但是我如何让它更新该对象来自响应的数据?

我查看了我的 wsdl,它正在生成类似的 java 代码(使用 void 返回和参数列表而不是单个对象参数)。但我有不同的输入和输出类型。我的wsdl和你的相似吗?

操作名称与为输入类型定义的元素名称相同。我建议您将操作名称从“requests”更改为“processRequests”之类的名称,或者保留操作名称,并更改用于消息定义的元素的名称。

<wsdl:operation name="requests">

变成

<wsdl:operation name="processRequests">

我很想知道这是否适合你。

【讨论】:

  • 抱歉,我已调到另一家公司,无法再访问该项目的代码。如果我可以控制 WSDL 模式,我会将响应的根元素从“requests”更改为“response”
  • 嗨!我遇到了同样的错误。更改操作名称有效。 Zach,您知道这是 wsimport 的限制,还是有办法让 wsimport 处理操作名称与请求参数类型名称相同的情况?
  • @Arci 我不确定。如果更改操作名称不是您实际可以采用的解决方案(也许 wsdl 不在您的控制范围内),那么可能值得使用其他工具(例如 Axis)生成类。
  • 谢谢,我已经用你提供的方式解决了同样的问题。
  • 太棒了!您是如何找到解决方法的?在 CXF 2.1.x 和 3.1.x 上也是如此
【解决方案2】:

您可以通过指示 JAX-WS 禁用包装来解决此问题。这是通过 JAX-WS 绑定文件完成的。

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>

【讨论】:

  • 这是正确答案,点赞。请注意:您将上面的代码保存在 *.xjb 文件中并指示 wsimport 像这样使用它:“wsimport -b disable-wrappings.xjb your.wsdl”
  • Isaac 和@Aramir 当我找到你的答案时,我喜极而泣。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2012-04-03
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多