是的,您可能希望将 Web 服务端点添加到现有 Spring MVC 应用程序是有原因的。问题是您可能需要为每个路径设置不同的路径,这很好。
您将需要两个 servlet,一个用于处理 HTTP/MVC 的标准调度程序 servlet 和一个用于处理 SOAP 调用的 MessageDispatcherServlet。
配置可能很棘手。首先要明白,在添加 Spring-ws 依赖项时,会出现与 Spring MVC 的依赖项不匹配。您需要在 pom 中排除 Spring-web,如下所示:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
处理完这些后,您将需要添加两个 servlet,一个用于通过 Spring MVC 处理 Web 请求,一个用于处理 SOAP。
我假设使用 Spring 4 的 no-xml 配置,SpringBoot 也是可能的。
这是您将添加到 Web 初始化程序的关键代码:
DispatcherServlet servlet = new DispatcherServlet();
// no explicit configuration reference here: everything is configured in the root container for simplicity
servlet.setContextConfigLocation("");
/* TMT From Java EE 6 API Docs:
* Registers the given servlet instance with this ServletContext under the given servletName.
* The registered servlet may be further configured via the returned ServletRegistration object.
*/
ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", servlet);
appServlet.setLoadOnStartup(1);
appServlet.setAsyncSupported(true);
Set<String> mappingConflicts = appServlet.addMapping("/web/*");
MessageDispatcherServlet mds = new MessageDispatcherServlet();
mds.setTransformWsdlLocations(true);
mds.setApplicationContext(context);
mds.setTransformWsdlLocations(true);
ServletRegistration.Dynamic mdsServlet = servletContext.addServlet("mdsServlet", mds);
mdsServlet.addMapping("/wsep/*");
mdsServlet.setLoadOnStartup(2);
mdsServlet.setAsyncSupported(true);
这就是它的全部。配置的其余部分是标准的东西,可以在任意数量的示例中找到。
例如,您可以轻松地将 Spring MVC 和 Spring-WS 的 Spring IO 示例混合为测试平台。只要确保你设置了WebMvcConfigurerAdapter
和WsConfigurerAdapter
相应的。它们将是两个独立的类,分别用@Configuration @EnableWebMvc
和@EnableWs @Configuration
分别注释。它们必须与您的@Endpoint
类一起添加到组件扫描中。
使用浏览器编译、运行和测试 MVC 内容,从根上下文通过/web/*
,并使用 SoapUI 通过导入 WSDL 并击中/wsep/*
根来调用 SOAP。每个 servlet 处理的每个路径。