I build a simple Camel Project with a SOAP Web Service that writes a file and sends the response: it's packaged as bundle and I deployed it successfully on Karaf, you can find the source here
Then I'd like to convert this project in a WAR module and deploy it on Fuse on EAP: following these instructions
Apache Camel: Tutorial on using Camel in a Web Application
I modified (in pom.xml) bundle -> war, I moved applicationContext.xml under src/main/webapp, and I created a web.xml with the Spring context loader: when I install the WAR I see (on server logs) that the Camel route is started but the SOAP WS isn't exposed
10:03:40,981 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Apache Camel 2.15.1 (CamelContext: camelId) is starting
10:03:40,994 INFO [org.apache.camel.management.ManagedManagementStrategy] (ServerService Thread Pool -- 75) JMX is enabled
10:03:41,120 INFO [org.apache.camel.impl.converter.DefaultTypeConverter] (ServerService Thread Pool -- 75) Loaded 197 type converters
10:03:41,339 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.
10:03:41,339 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
10:03:41,370 INFO [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (ServerService Thread Pool -- 75) Creating Service {http://www.springframework.org/schema/beans}CamelHelloWorldService from WSDL: classpath:wsdl/Hello.wsdl
10:03:41,732 INFO [org.apache.cxf.endpoint.ServerImpl] (ServerService Thread Pool -- 75) Setting the server's publish address to be /CamelHelloWorld
10:03:41,764 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Route: route2 started and consuming from: Endpoint[cxf://bean:helloWorldEndpointId]
10:03:41,764 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Total 1 routes, of which 1 is started.
10:03:41,764 INFO [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Apache Camel 2.15.1 (CamelContext: camelId) started in 0.783 seconds
10:03:41,764 INFO [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 75) Root WebApplicationContext: initialization completed in 2131 ms
10:03:41,826 INFO [org.jboss.as.server] (HttpManagementService-threads - 2) JBAS015859: Deployed "camel-hello-world-0.0.21-SNAPSHOT.war" (runtime-name : "camel-hello-world-0.0.21-SNAPSHOT.war")
To be honest I see this exception too
10:03:39,711 WARN [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (ServerService Thread Pool -- 75) Ignored XML validation warning: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 419; SchemaLocation: schemaLocation value = ' http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd http://camel.apache.org/schema/cxf/camel-cxf-spring.xsd' must have even number of URI's.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:196)
at org.apache.xerces.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:97)
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:386)
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:322)
but I think it's only a warning.
Does anyone have any idea?
Thanks in advance
The 'must have even number of URI's' exception is because you have a superfluous entry for camel-cxf-spring.xsd
at the end of the xsi:schemaLocation
.
You may find it better to base your code on the Camel Tomcat CXF example as it demonstrates how to set up CXFServlet
in web.xml. You'll need this is you want the CXF consumer to work. E.g like this:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webservices/*</url-pattern>
</servlet-mapping>
If you're using Fuse on EAP 7.0 or 7.1, you can avoid the Spring ContextLoaderListener
and CXFServlet
as the app server takes care of bootstrapping Spring & CXF for you. There's an example project here.