web services - 'No adapter for endpoint' exception - apache-camel with spring-boot & spring-ws -
jvm 1.8.0_45
apache-camel 2.15.2
spring-ws 2.2.1
spring-boot 1.2.4
i trying use apache-camel (2.15.2) within spring-boot application handle incoming web service calls.
i created initial working spring boot project (no camel) following guidelines here http://spring.io/guides/gs/producing-web-service/
i attempted integrate camel: spring web services component consumer handle incoming web service requests following guidelines in 'exposing web services' section here http://camel.apache.org/spring-web-services.html
webserviceconfig.java
import org.apache.camel.component.spring.ws.bean.camelendpointmapping; @enablews @configuration public class webserviceconfig extends wsconfigureradapter { @bean public servletregistrationbean messagedispatcherservlet(applicationcontext applicationcontext) { messagedispatcherservlet servlet = new messagedispatcherservlet(); servlet.setapplicationcontext(applicationcontext); servlet.settransformwsdllocations(true); return new servletregistrationbean(servlet, "/ws/*"); } // default wsdl stuff here... // exposing endpoint mapping bean here rather in spring-ws-servlet.xml (seems work) @bean public camelendpointmapping endpointmapping() { return new camelendpointmapping(); } }
claimrouter.java
import org.apache.camel.logginglevel; import org.apache.camel.builder.routebuilder; import org.apache.camel.model.dataformat.jaxbdataformat; import org.springframework.stereotype.component; @component public class claimrouter extends routebuilder { @override public void configure() throws exception { jaxbdataformat jaxb = new jaxbdataformat(false); jaxb.setcontextpath("uk.co.example.claim.ws.v2"); // comment @payloadroot annotation in claimendpointv2.java enable requests mapped camel route from("spring-ws:rootqname:{http://example.co.uk/claim/ws/v2}getclaimrequest?endpointmapping=#endpointmapping") .to("log:uk.co.example.claim.ws.v2?level=info") .unmarshal(jaxb) .process(new claimprocessor()) .marshal(jaxb); } }
according log (below) incoming requests mapped camel consumer, fails 'no adapter endpoint'
[2015-06-24 13:22:03.981] boot - 6892 debug [http-nio-8090-exec-6] --- wsdldefinitionhandleradapter: transforming [/ws] [http://localhost:8090/ws] [2015-06-24 13:22:03.983] boot - 6892 debug [http-nio-8090-exec-6] --- messagedispatcherservlet: completed request [2015-06-24 13:22:13.544] boot - 6892 debug [http-nio-8090-exec-7] --- webservicemessagereceiverhandleradapter: accepting incoming [org.springframework.ws.transport.http.httpservletconnection@70863933] @ [http://localhost:8090/ws] [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- received: received request [saajsoapmessage {http://example.co.uk/claim/ws/v2}getclaimrequest] [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- payloadrootannotationmethodendpointmapping: looking endpoint [{http://example.co.uk/claim/ws/v2}getclaimrequest] [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: endpoint mapping [org.springframework.ws.server.endpoint.mapping.payloadrootannotationmethodendpointmapping@5fdbde50] has no mapping request [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- soapactionannotationmethodendpointmapping: looking endpoint [] [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: endpoint mapping [org.springframework.ws.soap.server.endpoint.mapping.soapactionannotationmethodendpointmapping@50bf4dcb] has no mapping request [2015-06-24 13:22:13.547] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: endpoint mapping [org.springframework.ws.soap.addressing.server.annotationactionendpointmapping@8b5028a] has no mapping request [2015-06-24 13:22:13.548] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: endpoint mapping [org.apache.camel.component.spring.ws.bean.camelendpointmapping@7a9ff5b1] maps request endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]] [2015-06-24 13:22:13.548] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: testing endpoint adapter [org.springframework.ws.server.endpoint.adapter.defaultmethodendpointadapter@5a1e093a] [2015-06-24 13:22:13.549] boot - 6892 debug [http-nio-8090-exec-7] --- soapfaultannotationexceptionresolver: resolving exception endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]]: java.lang.illegalstateexception: no adapter endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]]: endpoint annotated @endpoint, or implement supported interface messagehandler or payloadendpoint? [2015-06-24 13:22:13.549] boot - 6892 debug [http-nio-8090-exec-7] --- simplesoapexceptionresolver: resolving exception endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]]: java.lang.illegalstateexception: no adapter endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]]: endpoint annotated @endpoint, or implement supported interface messagehandler or payloadendpoint? [2015-06-24 13:22:13.549] boot - 6892 debug [http-nio-8090-exec-7] --- soapmessagedispatcher: endpoint invocation resulted in exception - responding fault java.lang.illegalstateexception: no adapter endpoint [consumer[spring-ws://rootqname:(http://example.co.uk/claim/ws/v2)getclaimrequest?endpointmapping=%23endpointmapping]]: endpoint annotated @endpoint, or implement supported interface messagehandler or payloadendpoint? @ org.springframework.ws.server.messagedispatcher.getendpointadapter(messagedispatcher.java:302) @ org.springframework.ws.server.messagedispatcher.dispatch(messagedispatcher.java:235) @ org.springframework.ws.server.messagedispatcher.reessagedispatcher.java:176) @ org.springframework.ws.transport.support.webservicemessagereceiverobjectsupport.handleconnection(webservicemessagereceiverobjectsupport.java:89) @ org.springframework.ws.transport.http.webservicemessagereceiverhandleradapter.handle(webservicemessagereceiverhandleradapter.java:61) @ org.springframework.ws.transport.http.messagedispatcherservlet.doservice(messagedispatcherservlet.java:293) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:966) @ org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet.java:868) @ javax.servlet.http.httpservlet.service(httpservlet.java:648) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:842) @ javax.servlet.http.httpservlet.service(httpservlet.java:729) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:291) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal(hiddenhttpmethodfilter.java:77) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:85) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catali.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:219) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:106) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:142) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:88) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:518) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1091) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:668) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1521) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.run(nioendpoint.java:1478) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) @ org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) @ java.lang.thread.run(thread.java:745) [2015-06-24 13:22:13.554] boot - 6892 debug [http-nio-8090-exec-7] --- sent: sent response [saajsoapmessage {http://schemas.xmlsoap.org/soap/envelope/}fault] request [saajsoapmessage {http://example.co.uk/claim/ws/v2}getclaimrequest] [2015-06-24 13:22:13.556] boot - 6892 debug [http-nio-8090-exec-7] --- messagedispatcherservlet: completed request
my gradle dependencies follows:
dependencies { compile("org.springframework.boot:spring-boot-starter-ws") { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } compile("org.springframework.boot:spring-boot-starter") { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } compile("org.springframework.boot:spring-boot-starter-log4j") compile("org.springframework:spring-web") compile("com.fasterxml.jackson.core:jackson-databind") compile("org.apache.camel:camel-core:2.15.2") compile("org.apache.camel:camel-spring-boot:2.15.2") compile("org.apache.camel:camel-spring-ws:2.15.2") compile("org.apache.camel:camel-jaxb:2.15.2") testcompile("org.springframework.boot:spring-boot-starter-test") compile 'org.slf4j:slf4j-log4j12:1.7.12' compile("wsdl4j:wsdl4j:1.6.1") jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1") compile sourcesets.generated.output }
i've researched large number of no adapter endpoint problems , of them seem caused return type of endpoint. however, i'm creating camel route, presumably camel-spring-ws integration should providing actual endpoint.
am missing key piece of configuration/annotation or there more fundamental problem (some version incompatibility, perhaps)? or insights appreciated.
when spring boot used, registers defaultmethodendpointadapter configures annotation driven spring ws programming model. makes possible use various annotations @endpoint, @payload auto detected.
as in our case, spring-ws endpoint has hand on ws requests camel endpoint, defaultmethodendpointadapter won't job us.
below part of code in spring framework end point adapters registration,
private void initendpointadapters(applicationcontext applicationcontext) throws beansexception {
if (endpointadapters == null) { map<string, endpointadapter> matchingbeans = beanfactoryutils .beansoftypeincludingancestors(applicationcontext, endpointadapter.class, true, false);
if (!matchingbeans.isempty()) { endpointadapters = new arraylist(matchingbeans.values()); collections.sort(endpointadapters, new ordercomparator()); }
else { endpointadapters = defaultstrategieshelper.getdefaultstrategies(endpointadapter.class, applicationcontext); if (logger.isdebugenabled()) { logger.debug("no endpointadapters found, using defaults"); } } } }
when use spring-boot, defaultmethodendpointadapter gets registered , hence first 'if block' runs , hence doesn't register other adapters messageendpointadapter, payloadendpointadapter etc.
what need in case is, other defaultmethodendpointadapter, have register messageendpointadapter offload spring-ws camel endpoints.
so in webserviceconfig class, add below code,
@bean public endpointadapter messageendpointadapter() { return new messageendpointadapter(); }
then handover magic happens.
messageendpointadapter required spring-ws , camel handover.
Comments
Post a Comment