入力メッセージと出力メッセージに同じ要素定義を使用するクライアントの 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
が、<xsd:choice>
withRequestData
またはがあるためResponseData
、後者は null であり、RequestData
は指定したとおりです。
私は他のプロジェクトで JAX-WS を正常に使用しましたが、その場合@WebResult
、WebResult にちなんで名付けられた void 以外の戻り値の型を持つコードが生成されました。このプロジェクトでは、JAX-WS が要求と応答のタイプが同じであり、同じオブジェクトを再利用できると判断したため、WebResult を取得していないと思います。応答?