I have a problem with a maven project using wsdl first and Camel CXF+Spring deployed on JBoss Fuse. Calling the service the following exception occurs:
12:21:58,961 | WARN | qtp477359063-69 | PhaseInterceptorChain | 74 - org.apache.cxf.cxf-core - 3.0.4.redhat-621084 | Interceptor for {http://service.opf.meter.itd.it}OpfImpl#{http://service.opf.meter.itd.it}getOpf has thrown exception, unwinding now
java.lang.IllegalArgumentException: Part {http://service.opf.meter.itd.it}getOpfResponse should be of type it.itd.meter.opf.service.GetOpfResponse, not java.lang.String
at org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:292)[79:org.apache.cxf.cxf-rt-databinding-jaxb:3.0.4.redhat-621084]
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:220)[79:org.apache.cxf.cxf-rt-databinding-jaxb:3.0.4.redhat-621084]
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:122)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:69)[78:org.apache.cxf.cxf-rt-wsdl:3.0.4.redhat-621084]
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:83)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)[74:org.apache.cxf.cxf-core:3.0.4.redhat-621084]
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:212)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)[82:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0.0]
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:268)[96:org.apache.cxf.cxf-rt-transports-http:3.0.4.redhat-621084]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:69)[93:org.ops4j.pax.web.pax-web-jetty:3.2.5]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:240)[93:org.ops4j.pax.web.pax-web-jetty:3.2.5]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:75)[93:org.ops4j.pax.web.pax-web-jetty:3.2.5]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[86:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at java.lang.Thread.run(Thread.java:745)[:1.7.0_101]
Here is my wsdl:
<wsdl:definitions targetNamespace="http://service.opf.meter.itd.it"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://service.opf.meter.itd.it"
xmlns:intf="http://service.opf.meter.itd.it"
xmlns:tns1="http://bean.opf.meter.itd.it"
xmlns:tns2="http://branch.bean.opf.meter.itd.it"
xmlns:tns3="http://bus.bean.opf.meter.itd.it"
xmlns:tns4="http://constrain.bean.opf.meter.itd.it"
xmlns:tns5="http://summary.bean.opf.meter.itd.it"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
(type omitted...)
<wsdl:message name="getOpfResponse">
<wsdl:part element="impl:getOpfResponse" name="getOpfResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getOpfRequest">
<wsdl:part element="impl:getOpfRequest" name="getOpfRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="OpfImpl">
<wsdl:operation name="getOpf">
<wsdl:input message="impl:getOpfRequest"></wsdl:input>
<wsdl:output message="impl:getOpfResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="OpfImplSoapBinding" type="impl:OpfImpl">
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getOpf">
<wsdlsoap:operation soapAction="" style="document"/>
<wsdl:input>
<wsdlsoap:body parts="getOpfRequest" use="literal"/>
</wsdl:input>
<wsdl:output>
<wsdlsoap:body parts="getOpfResponse" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="OpfImpl">
<wsdl:port binding="impl:OpfImplSoapBinding" name="DummyOpf">
<wsdlsoap:address location="http://192.168.80.125:8181/cxf/OptimalPowerFlow/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
The (generated) interface:
package it.itd.meter.opf.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
/**
* This class was generated by Apache CXF 2.7.0.redhat-611423
* 2017-03-16T10:52:40.701+01:00
* Generated source version: 2.7.0.redhat-611423
*
*/
@WebService(targetNamespace = "http://service.opf.meter.itd.it", name = "OpfImpl")
@XmlSeeAlso({ObjectFactory.class, it.itd.meter.opf.bean.summary.ObjectFactory.class, it.itd.meter.opf.bean.bus.ObjectFactory.class, it.itd.meter.opf.bean.constrain.ObjectFactory.class, it.itd.meter.opf.bean.ObjectFactory.class, it.itd.meter.opf.bean.branch.ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface OpfImpl {
@WebMethod(action = "http://service.opf.meter.itd.it/getOpf")
@WebResult(name = "getOpfResponse", targetNamespace = "http://service.opf.meter.itd.it", partName = "getOpfResponse")
public GetOpfResponse getOpf(
@WebParam(partName = "getOpfRequest", name = "getOpfRequest", targetNamespace = "http://service.opf.meter.itd.it")
GetOpfRequest getOpfRequest
);
}
so the implementation:
@javax.jws.WebService(
serviceName = "OpfImpl",
portName = "DummyOpf",
targetNamespace = "http://service.opf.meter.itd.it",
wsdlLocation = "file:/home/meter/workdir/OptimalPowerFlow/src/main/resources/wsdl/OpfImpl.wsdl",
endpointInterface = "it.itd.meter.opf.service.OpfImpl")
public class DummyOpf implements OpfImpl {
private static final Logger LOG = Logger.getLogger(DummyOpf.class.getName());
@Override
public GetOpfResponse getOpf(GetOpfRequest getOpfRequest) {
System.out.println(getOpfRequest);
LOG.info(getOpfRequest.toString());
try{
OpfBean data = populateOpf();
GetOpfResponse getOpfResponse = new GetOpfResponse();
getOpfResponse.setGetOpfReturn(data);
return getOpfResponse;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
Finally, the route configuration:
camel-cxf.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://camel.apache.org/schema/cxf"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://camel.apache.org/schema/cxf
http://camel.apache.org/schema/cxf/camel-cxf.xsd">
<cxf:cxfEndpoint id="getOpfEndpoint"
address="/OptimalPowerFlow/"
serviceClass="it.itd.meter.opf.service.OpfImpl"
wsdlURL="wsdl/OpfImpl.wsdl"/>
<bean id="getDummyOpf" class=" it.itd.meter.OptimalPowerFlow.DummyOpf"/>
</beans>
camel-route.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<import resource="classpath:META-INF/spring/camel-cxf.xml" />
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<!-- route starts from the cxf webservice, see camel-cxf.xml for details -->
<from uri="cxf:bean:getOpfEndpoint" />
<bean ref="getDummyOpf"/>
<to uri="seda:incomingOrders" />
<!-- and then create the OK reply for the webservice which is still waiting for a reply -->
<transform>
<constant>OK</constant>
</transform>
</route>
<!-- test route -->
<route>
<from uri="seda:incomingOrders" />
<to uri="mock:end"/>
</route>
</camelContext>
</beans>
Any suggestion?