Spring Boot et CXF
Rédigé par gorki Aucun commentaireLe problème :
SpringBoot c'est assez pratique, le REST est géré de base avec Spring Boot MVC, mais parfois on a aussi besoin d'un serveur SOAP et là souvent CXF est utilisé plutôt que Spring MVC...)
Petit pense bête car les solutions trouvées sur le net me semble :
- compliquée : en utilisant Spring integration
- incomplète : déclaration simple
Solution :
En trois étapes :
- - Utiliser un fichier spring externe à Spring Boot
- - Déclarer la servlet CXF
- - Configurer Spring et CXF
Point 1 et 2 : dans l'application Spring Boot
Attention :
- dans notre exemple, CXF va gérer les URLs commençant par /soap/
- ne pas oublier de démarrer la servlet CXF
package com.test.springboot.cxf import javax.annotation.PreDestroy; import org.apache.cxf.transport.servlet.CXFServlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; /** * */ @Configuration @ImportResource("classpath:spring-cxf.xml") @ComponentScan @EnableAutoConfiguration() public class SpringBootCxf { private static final Logger LOGGER = LoggerFactory.getLogger(SpringBootCxf.class); public static void main(final String[] args) throws Exception { SpringApplication.run(SpringBootCxf.class, args); } @Bean public ServletRegistrationBean cxfServlet() { ServletRegistrationBean servletDef = new ServletRegistrationBean(new CXFServlet(), "/soap/*"); servletDef.setLoadOnStartup(1); return servletDef; } @PreDestroy public void exit() { LOGGER.info("Exiting"); } }
Point 3 : Le fichier de configuration Spring - CXF
Attention :
- le point important ici est le lien entre le fichier XML et le composant qui implémente le service :
implementor="#eventServiceSoap"
Fichier XML complet :
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:soap="http://cxf.apache.org/bindings/soap" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- these are included in the dependency jar --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- event --> <jaxws:endpoint id="eventServiceEndpoint" implementor="#eventServiceSoap" address="/event"> <jaxws:properties> <entry key="schema-validation-enabled" value="false" /> </jaxws:properties> <jaxws:binding> <soap:soapBinding version="1.2" mtomEnabled="true" /> </jaxws:binding> </jaxws:endpoint> </beans>
Ensuite on peut utiliser un composant "Autowired" by Spring :
- EventManagerBean est le résultat de la génération WSDL2Java
@Component("eventServiceSoap") public class EventServiceImpl implements EventManagerBean { /** The Constant LOGGER. */ private static final Logger LOGGER = LoggerFactory.getLogger(EventServiceImpl.class); @Autowired EventRepository eventRepository; ...