Подтвердить что ты не робот

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, последний null и RequestData, как я уже сказал.

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

4b9b3361

Ответ 1

Вы можете решить эту проблему, поручив JAX-WS отключить упаковку. Это делается через файл привязок JAX-WS.

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

Ответ 2

У меня была такая же проблема. Я экспериментировал с именами, которые я использовал для различных типов, элементов, имен сообщений, имен операций и т.д. Я наконец нашел ключ, и что-то, что вы сказали в своем вопросе, фактически приблизило меня к ответу:

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

Я посмотрел на свой wsdl, который генерировал аналогичный Java-код (с возвратом void и списком параметров вместо одного параметра объекта). Но у меня разные типы ввода и вывода. Как насчет моего wsdl был похож на ваш?

Название операции было таким же, как имя элемента, определенного для типа ввода. Я бы предположил, что вы меняете свое имя операции из "запросов" на что-то вроде "processRequests" или оставляете только имя операции и изменяете имя элемента, используемого для определений сообщений.

<wsdl:operation name="requests">

становится

<wsdl:operation name="processRequests">

Я хотел бы услышать, если это сработает для вас.