3

Spring MVC プロジェクトがあります。私は次のようなコードを書きました

@Controller
@RequestMapping("CallBack")
@WebService(name = "NotificationToCP", targetNamespace = "http://SubscriptionEngine.ibm.com")
public class CallbackController {

    @RequestMapping("")
    @ResponseBody
    @WebMethod(action = "notificationToCP")
    @RequestWrapper(localName = "notificationToCP", targetNamespace = "http://SubscriptionEngine.ibm.com", className = "in.co.mobiz.airtelVAS.model.NotificationToCP_Type")
    @ResponseWrapper(localName = "notificationToCPResponse", targetNamespace = "http://SubscriptionEngine.ibm.com", className = "in.co.mobiz.airtelVAS.model.NotificationToCPResponse")
    public NotificationToCPResponse index(
            @WebParam(name = "notificationRespDTO", targetNamespace = "") CPNotificationRespDTO notificationRespDTO) {
        return new NotificationToCPResponse();
    }
}

Spring MVC + Webservices を一緒に使用できますか? 私が欲しいのは、SOAP リクエストを受け入れて処理するコントローラーとしてだけです。URL は /CallBack である必要があります。私はまだ初心者であることに戸惑っています。上記のようなものが機能しますか。そうでなければ、どうすればそれを実現できますか。

4

2 に答える 2

6

Spring MVC と SOAP Web サービス (JAX-WS) は目的が異なるため、それらを混在させることはしません。

ビジネス オペレーションをサービス クラスにカプセル化し、MVC コントローラーと JAX-WS の両方を使用して公開することをお勧めします。例えば:

ハローサービス

@Service
public class HelloService {
    public String sayHello() {
        return "hello world";
    }
}

HelloController には、オートワイヤリングによって挿入された HelloService 参照があります。これは、サービスを呼び出し、結果をモデルとしてビュー (例: hello.jsp ビュー) に渡す標準の Spring MVC コントローラーです。

@Controller
@RequestMapping("/hello")
public class HelloController {
    @Autowired private HelloService helloService;

    @RequestMapping(method = RequestMethod.GET)
    public String get(Model model) {
        model.addAttribute("message", helloService.sayHello());
        return "hello";
    }
}

JAX-WS エンドポイントも同じサービスを呼び出します。違いは、サービスが SOAP Web サービスとして公開されることです。

@WebService(serviceName="HelloService")
public class HelloServiceEndpoint {
    @Autowired private HelloService helloService;

    @WebMethod
    public String sayHello() {
        return helloService.sayHello();
    }
}

上記の JAX-WS スタイルの Web サービスは、特に非 Java EE 環境 (tomcat) にデプロイされている場合、すべての Spring デプロイで自動的に動作することが保証されていないことに注意してください。追加のセットアップが必要になる場合があります。

于 2013-06-17T03:59:32.443 に答える
0

はい、既存の 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 呼び出しを行います。各サーブレットによって処理される各パス。

于 2015-08-05T04:15:51.593 に答える