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

Popular posts from this blog

How has firefox/gecko HTML+CSS rendering changed in version 38? -

javascript - Complex json ng-repeat -

jquery - Cloning of rows and columns from the old table into the new with colSpan and rowSpan -