CXF веб-служба ClassCastException при назначении типа возврата при использовании WS-Reliable Messaging

У меня есть WSDL-первый веб-сервис, использующий CXF 2.7.6 в стиле Wrapped. Метод интерфейса веб-службы getState возвращает значение типа int. Однако, когда я вызываю веб-сервис из моего клиентского кода CXF, я обычно получаю ClassCastException с сообщением "невозможно преобразовать объект GetStateResponse в Integer". Обычно я говорю, потому что ClassCastException не происходит каждый раз, когда я делаю вызов веб-службы. Я также периодически получаю похожее исключение ClassCastException при вызовах других методов в интерфейсе веб-службы. Интересно, что это исключение происходит только с настроенным WS-Reliable Messaging. Мы развертываем на сервере JBoss EAP 6, но используем библиотеки CXF напрямую (вместо использования встроенной подсистемы веб-сервисов JBoss)

Я могу обойти проблему, назначив возвращаемое значение для объекта, а затем определив его тип и обработав его соответствующим образом, но это определенная попытка, и я хотел бы найти основную причину проблемы. Ниже приведены выдержки из WSDL, схемы и класса интерфейса.

WSDL выдержки:

<wsdl:definitions>
    <wsdl:message name="getState">
        <wsdl:part name="parameters" element="msgs:getState"/>
    </wsdl:message>

    <wsdl:portType>
        <wsdl:operation name="getState">
            <wsdl:input name="getState" message="tns:getState"/>
            <wsdl:output name="getStateResponse" message="tns:getStateResponse"/>
            <wsdl:fault name="SOAPFaultException" message="tns:SOAPFaultException"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding>
        <wsdl:operation name="getState">
            <soap:operation soapAction="" style="document"/>
            <wsdl:input name="getState">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="getStateResponse">
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="SOAPFaultException">
                <soap:fault name="SOAPFaultException" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
</wsdl:definitions>

SCHEMA упоминается с префиксом "msgs:" выше:

<xs:element name="getState" type="tns:getState"/>

<xs:complexType name="getState">
    <xs:sequence>
        <xs:element minOccurs="0" name="param1" type="xs:string" />
        <xs:element minOccurs="0" name="param2" type="xs:string" />
    </xs:sequence>
</xs:complexType>

ИНТЕРФЕЙС КЛАСС:

@WebResult(name = "return", targetNamespace = "")
@RequestWrapper(localName = "getState", targetNamespace = "http://messages.space.my.name", className = "my.name.space.GetState")
@WebMethod
@ResponseWrapper(localName = "getStateResponse", targetNamespace = "http://messages.space.my.name", className = "my.name.space.GetStateResponse")
public int getState(
@WebParam(name = "param1", targetNamespace = "")
java.lang.String param1,
@WebParam(name = "param2", targetNamespace = "")
java.lang.String param2) throws SOAPFaultException;

Конфигурация клиента Spring jaxws:

<jaxws:client id="wsProxy" serviceClass="my.name.space.IWebServiceInterface">
    <jaxws:inInterceptors>
        <bean id="loggingInInterceptor" 
              class="org.apache.cxf.interceptor.LoggingInInterceptor" >
            <property name="prettyLogging" value="true" />
        </bean>
        <ref bean="rmLogicalIn"/>
        <ref bean="rmCodec"/>
    </jaxws:inInterceptors>
    <jaxws:outInterceptors>
        <bean id="loggingOutInterceptor" 
              class="org.apache.cxf.interceptor.LoggingOutInterceptor" >
            <property name="prettyLogging" value="true" />
        </bean>
        <ref bean="rmLogicalOut"/>
        <ref bean="rmCodec"/>
    </jaxws:outInterceptors>
</jaxws:client>

Трассировки стека:

[33m [0m [31m00:39:20,589 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/TEST_GUI].[jsp]] (ajp-/0.0.0.0:8009-9) JBWEB000236: 
Servlet.service() for servlet jsp threw exception: java.lang.ClassCastException: my.name.space.messages.GetStateResponse cannot be cast to java.lang.Integer [0m
[31m    at $Proxy139.getState(Unknown Source)   at org.apache.jsp.client.framework.MWS_005fTEST_jsp.waitForState(MWS_005fTEST_jsp.java:166) [0m
[31m    at org.apache.jsp.client.framework.MWS_005fTEST_jsp._jspService(MWS_005fTEST_jsp.java:508) [0m
[31m    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] [0m
[31m    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:365) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at mil.jpmis.cbrnis.client.framework.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:148) [TESTGUI.jar:] [0m
[31m    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.jboss.modcluster.container.jbossweb.JBossWebContext$RequestListenerValve.event(JBossWebContext.java:91) [0m
[31m    at org.jboss.modcluster.container.jbossweb.JBossWebContext$RequestListenerValve.invoke(JBossWebContext.java:72) [0m
[31m    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:512) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.4.3.Final-redhat-2.jar:7.4.3.Final-redhat-2] [0m
[31m    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:490) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:420) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) [jbossweb-7.4.10.Final-redhat-1.jar:7.4.10.Final-redhat-1] [0m
[31m    at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0]

Я также разместил это в списке Nabble cxf-users, но ответа пока нет. Любая помощь будет оценена!

1 ответ

Обновите и ответьте на @gnzlrm в комментарии выше, если я правильно помню (это было более 2 лет назад), мы никогда не выделяли причину этой проблемы, но мы обнаружили, что при обновлении до более поздней версии CXF мы не дольше видел проблему (я думаю, что 2.7.13 и выше работали, но мы закончили обновление до 3.1.7).

Другие вопросы по тегам