Nic*_*ion 13 java soap jax-ws wsimport
我正在使用客户端的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>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,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);
Run Code Online (Sandbox Code Playgroud)
当我调用时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 -->
Run Code Online (Sandbox Code Playgroud)
然而,当我在调试模式下运行我的应用程序,我可以看到每个RequestType
在调试器变量视图实例,但是因为RequestsType
有一个<xsd:choice>
与RequestData
或ResponseData
,后者为null并且RequestData
是为我提供的.
我已成功在其他项目中使用JAX-WS,但在这些情况下,它生成的代码具有@WebResult
以WebResult命名的非void返回类型.在这个项目中,我认为我没有得到WebResult,因为JAX-WS已经确定请求和响应类型是相同的并且它可以重用相同的对象 - 但是如何让它用来自的数据更新该对象响应?
Isa*_*aac 13
您可以通过指示JAX-WS禁用包装来解决此问题.这是通过JAX-WS绑定文件完成的.
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
<jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)
Zac*_*des 11
我遇到了完全相同的问题.我试验了我用于各种类型,元素,消息名称,操作名称等的名称.我终于找到了钥匙,你在问题中说的话实际上让我接近答案:
在这个项目中,我认为我没有得到WebResult,因为JAX-WS已经确定请求和响应类型是相同的并且它可以重用相同的对象 - 但是如何让它用来自的数据更新该对象响应?
我查看了我的wsdl,它生成了类似的java代码(使用void返回和参数列表而不是单个对象参数).但我有不同的输入和输出类型.我的wsdl与你的相似?
操作的名称与为输入类型定义的元素的名称相同.我建议您将操作名称从"请求"更改为"processRequests",或者单独保留操作名称,并更改用于消息定义的元素的名称.
<wsdl:operation name="requests">
Run Code Online (Sandbox Code Playgroud)
变
<wsdl:operation name="processRequests">
Run Code Online (Sandbox Code Playgroud)
我很想知道这是否适合你.
归档时间: |
|
查看次数: |
10026 次 |
最近记录: |