Trying to deploy a JAX-WS endpoint using Tomcat 7 Maven plugin and CXF
2.7.8. As a matter of preference, I don't want to have any XML config for
Spring or CXF. I see several blogs, articles, posts using cxf-servlet.xml
and CXFServlet but none whatsoever completely using Java config. Looking into the CXFServlet source code, it looks for the cxf-servlet.xml
or anything in the servlet context under the key 'config-location'
. I tried programmatically registering the endpoint instead of in cxf-servlet.xml
, but it doesn't work; I get a 404 when accessing the service. Any ideas?
@Configuration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
public class CXFConfig {
@Autowired
Bus cxfBus;
// More code
@Bean
public Endpoint calculator() {
EndpointImpl endpoint = new EndpointImpl(cxfBus, new Calculator());
endpoint.setAddress("/CalculatorService");
return endpoint;
}
}
If you're using Spring Boot, you can use:
To add an endpoint:
Official documentation of the CXF-Boot integration.
This thread definitely put me on the right track to getting CXF to run in pure Spring Java configuration, but it didn't provide everything that is required.
For my self, pure Java configuration means without a
web.xml
file, which I think this answer assumes is present. Spring Boot for example doesn't use aweb.xml
file.So to register a CXF endpoint without the use of any XML files at all you will need a configuration file that also loads the
CXFServlet
.The above is all the configuration required to successfully load a CXF endpoint within Spring.
I have also created a small project that demonstrates this.
I belive that if you pass your beans inside factory.setServiceBeans it will work
All that's needed is a
endpoint.publish()
call above.Everything posted here is not 100% XML configuration free - all posts are using the classpath:META-INF/cxf/cxf.xml, which is also used in most tutorials on the web. But there´s a solution for that: Define a org.apache.cxf.bus.spring.SpringBus as @Bean and configure name = Bus.DEFAULT_BUS_ID, comming from org.apache.cxf.Bus.
As described in the other answers, the org.apache.cxf.jaxws.EndpointImpl has to be instantiated - including forwarding of the Beans SpringBus and the SEI-implementing Class. Also, the publish()-Method of EndpointImpl has to becalled, including a String containing an URL ending:
If you want to learn more about Apache CXF together with SpringBoot, I recommend a look on this github project.