jax -ws/wsimport генерирует WebMethod с возвратом void -тот же Request/ResponseWrapper

Я работаю с файлом 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>с RequestDataили ResponseData, последнее равно нулю, а RequestDataтакое, как я указал.

Я успешно использовал JAX -WS в других проектах, но в этих случаях он генерировал код с @WebResultи не -типом возвращаемого значения void, названным в честь WebResult. В этом проекте, я думаю, я не получаю WebResult, потому что JAX -WS решил, что типы запроса и ответа одинаковы, и он может повторно использовать один и тот же объект -, но как мне заставить его обновить этот объект с данными из ответа?

13
задан Nicholas Albion 16 April 2012 в 05:24
поделиться