我正在将旧版Web服务(SOAP)应用程序迁移到Spring Boot2.x。我使应用程序成功启动,加载了上下文,但是没有映射我的(现有)SOAP端点。
应用程序具有使用@WebService
和@WebMethod
批注定义的许多不同的SOAP服务。映射当前是在sun-jaxws.xml
和web.xml
中定义的,但是在Spring Boot上,我想不使用任何XML,而只使用Java和注释。
例如,请考虑以下IndexingService
在其当前旧版实现中的作用:
sun-jaxws.xml
:
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint implementation="com.myapp.soap.IndexingService" name="indexingService" url-pattern="/soap/indexing"/>
...
</endpoints>
web.xml
:
<!-- jax-ws web service servlet context listener -->
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<!-- jax-ws web services servlet -->
<servlet>
<servlet-name>myWSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myWSServlet</servlet-name>
<url-pattern>/soap/indexing</url-pattern>
</servlet-mapping>
IndexingService.java
:
@WebService
public class IndexingService {
@WebMethod(operationName = "add")
public void add(@WebParam(name = "document") String document) {
...
}
}
我加入了spring-boot-starter-web-services
入门程序并创建了WsConfigurerAdapter
实现:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {
MessageDispatcherServlet messageDispatcherServlet = new MessageDispatcherServlet();
messageDispatcherServlet.setApplicationContext(context);
messageDispatcherServlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(messageDispatcherServlet, "/soap/*");
}
}
但是,在此之后我被卡住了。如何将带有IndexingService
的{{1}}映射到此javax.jws.WebService
?在Spring Boot上没有XML甚至有可能吗?
如果可能的话,我希望避免将所有SOAP服务重写为Spring Boot组件,因为这对于所有服务来说都是相当大的工作。
最后,我也想在这些SOAP服务上公开(生成的)WSDL,因为它也已经可以工作了。有一个简单的方法可以做到这一点吗?