はい、既存の Spring MVC アプリに Web サービス エンドポイントを追加する理由があります。問題は、それぞれに異なるパスが必要になる可能性が高いことですが、これは問題ありません。
HTTP/MVC を処理するための標準ディスパッチャー サーブレットと、SOAP 呼び出しを処理するための MessageDispatcherServlet の 2 つのサーブレットが必要になります。
設定が難しい場合があります。まず、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>
それを処理したら、Spring MVC を介して Web リクエストを処理するサーブレットと SOAP を処理するサーブレットの 2 つのサーブレットを追加する必要があります。
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
。これらは 2 つの別個のクラスに@Configuration @EnableWebMvc
なり、@EnableWs @Configuration
それぞれ と で個別に注釈が付けられます。@Endpoint
これらは、クラスと一緒にコンポーネント スキャンに追加する必要があります。
ブラウザを使用してルート コンテキストから MVC をコンパイル、実行、テストし、/web/*
SOAPUI を使用して WSDL をインポート/wsep/*
してルートをヒットすることで SOAP 呼び出しを行います。各サーブレットによって処理される各パス。