Reputation: 552
I am trying to use SOAP web services with Spring boot. I am able to get it working with Spring MVC application(using web.xml without spring boot) but i am stuck in configuring the same with Spring boot xml free setup.
Below is the code for my sample service i am trying to generate the wsdl for.
@WebService(serviceName="AddService", targetNamespace="http://add.sample.net/service/", name="addService", portName="adService")
public class MathOps extends SpringBeanAutowiringSupport {
@WebMethod
public int add(int a, int b){
return (a+b);
}
}
My Spring Boot config is as below:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
application.logStartupInfo(true);
return application.sources(Application.class);
}
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new ContextLoaderListener());
servletContext.addListener(new WSServletContextListener());
}
@Bean
public ServletRegistrationBean wsServlet(){
ServletRegistrationBean wsServletBean = new ServletRegistrationBean(new WSSpringServlet(), "/services");
return wsServletBean;
}
}
When i hit the URL localhost:8080/services, i get the below error.
There was an unexpected error (type=Not Found, status=404). /services/
Seems like for url mapping /services, dispatcherServlet is getting invoked instead of WSSpringServlet from below logs.
[2015-11-07 10:13:00.314] boot - 500 INFO [localhost-startStop-1] --- ServletRegistrationBean: Mapping servlet: 'WSSpringServlet' to [/services] [2015-11-07 10:13:00.316] boot - 500 INFO [localhost-startStop-1] --- ServletRegistrationBean: Mapping servlet: 'dispatcherServlet' to [/] [2015-11-07 10:13:01.405] boot - 500 INFO [main] --- Application: Started Application in 5.642 seconds (JVM running for 5.961) [2015-11-07 10:13:10.407] boot - 500 INFO [http-nio-8080-exec-1] --- [/]: Initializing Spring FrameworkServlet 'dispatcherServlet' [2015-11-07 10:13:10.408] boot - 500 INFO [http-nio-8080-exec-1] --- DispatcherServlet: FrameworkServlet 'dispatcherServlet': initialization started [2015-11-07 10:13:10.425] boot - 500 INFO [http-nio-8080-exec-1] --- DispatcherServlet: FrameworkServlet 'dispatcherServlet': initialization completed in 17 ms
The web.xml configuration which worke without spring boot is below.
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>MyTest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyTest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestService</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/services</url-pattern>
</servlet-mapping>
</web-app>
Please help with this issue.
Upvotes: 0
Views: 2953
Reputation: 552
I have finally managed to get the services working with Spring Boot :).
The only code missing was importing the XML configuration containing web services binding.
Below is the updated WebService configuration class used for configuring SOAP based services in Spring Boot.
@Configuration
@EnableWs
@ImportResource("classpath:/applicationContext.xml")
public class WebServiceConfiguration extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean wsServlet(){
ServletRegistrationBean wsServletBean = new ServletRegistrationBean(new WSSpringServlet(), "/services/*");
wsServletBean.setLoadOnStartup(1);
//wsServletBean.setInitParameters(initParameters);
return wsServletBean;
}
}
Also below is the applicationContext.xml placed in classpath.
<?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:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://jax-ws.dev.java.net/spring/core
http://jax-ws.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.java.net/spring/servlet.xsd">
<wss:binding url="/services/MathService">
<wss:service><!-- nested bean is of course fine -->
<ws:service bean="#MathService" />
</wss:service>
</wss:binding>
<wss:binding url="/services/StringService">
<wss:service><!-- nested bean is of course fine -->
<ws:service bean="#StringService" />
</wss:service>
</wss:binding>
<!-- this bean implements web service methods -->
<bean id="MathService" class="com.trial.services.MathOps" />
<bean id="StringService" class="com.trial.services.StringOps" />
</beans>
Hope it helps someone facing similar issue with Spring Boot and SOAP service configuration. :)
Upvotes: 1