2

2 つの外部サービス間に REST-SOAP ゲートウェイを構築する必要があります。最初の Web サービスは SOAP 要求を作成し、SOAP 応答を待ちます。2 番目のサービス (私の場合、Play Framework 1.2.4 で記述) は、RESTful アプローチを使用してのみ機能します。さまざまな理由から、SOAP 関連のものを 2 番目のサービスに統合したくありません。だから私はそれらの間で行動するためのいくつかの第3のサービスが必要です.

Apache Camel で Spring Web アプリを使用することを検討しましたが、Camel 用のモジュールが非常に多いため、全体像を把握できません。CXF-RS および SOAP コンポーネントは有望に見えますが、それらを使用してプロキシを実装する方法がわかりません。

まずは指定したSOAPリクエストをCamelにリッスンさせる方法です。次に、RESTful サービスから呼び出し元のサービスに応答をルーティングする方法について説明します。

スプリング構成のみでやってみました。

4

2 に答える 2

8

Camel CXFは、SOAP エンドポイントのトリックを実行します。

まず、エンドポイントを書く必要があります

@WebService
public interface QuoteInEndpoint {

  @WebResult(name = "quote")
  public Quote price(@WebParam(name = "symbol") String symbol);

}

次に、それを宣言する必要があります

<cxf:cxfEndpoint id="quoteIn" address="http://localhost:9002" serviceClass="my.package.QuoteInEndpoint" />

その後、このエンドポイントからルートを構築できます

from("cxf:bean:quoteIn")//
        .process(new Processor() {
          @Override
          public void process(Exchange exchange) throws Exception {
            //do whatever you need to get your object and transform it for your rest service
          }
        })//
        .to("http://myplayframeworkserver/myservice")//

Camel はルートを開始し、localhost:9002 で SOAP サービスの wsdl を公開し、すべての SOAP リクエストが残りのサーバーに送信されます。process メソッドを使用して、オブジェクトを残りのサービスの正しい形式に整形できます (json を想定しています)。プロセッサを使用する代わりに、別の Camel コンポーネントを使用してジョブを実行することもできます ( json が必要な場合はCamel JSON )。

于 2012-07-13T15:15:51.180 に答える
3

石鹸と休息の間を単純にプロキシする簡単な方法はありません。REST サービスは、すべてリソースと CRUD (作成/読み取り/更新/削除) に関するものです。ペイロードは何でもかまいませんが、多くの場合は JSON ですが、XML、プレーン テキスト、またはその他の形式が有効です。SOAP は、独自に定義されたメソッドを持つ XML のみです。

Camel でこれに関連するすべてのコンポーネントについての混乱を理解しています。

アプローチを選択する際には、いくつかの点に留意する必要があります。

  • 本当に必要な SOAP スタックの量は? ほとんどの場合、単純な SOAP エンベロープを受信し、WS-addressing、ws-security などを使用せずにペイロードを抽出するなど、基本的な機能のみが必要です。

  • コントラクトファーストまたはコードファーストのアプローチはありますか? つまり、SOAP サービスはすでに Java クラス/インターフェースによって定義されていますか、それとも WSDL がありますか?

  • Tomcat、Jetty、JavaEE アプリ サーバーなどのサーブレット コンテナー (非常に一般的) 内にキャメル インスタンスをデプロイしていますか? 何らかの理由でリクエストを処理するために、そのサーブレット コンテナを使用する必要がある場合があります (Web サーバーの仮想ホスト、ファイアウォールなどの何らかの理由で、同じポート/サーバー/ドメイン名からすべてのリクエストを取得するため)。その場合、CXF は少しトリッキーになるかもしれません。それ以外の場合、キャメルは組み込みの jetty コアを使用してリスナーを配置できます。

つまり、最初に契約し、serverletcontainer 内でラクダを実行します。開始するのが非常に簡単なので、私は spring-ws を好みます。 spring-ws コンポーネント. 春に最初のワイヤリングを行うだけで、WSDL から何かを生成する必要さえありません。メッセージを取得するための soap-action、uri、または rootq の名前を指定するだけです。

from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")

次に、XML を取得します。

camel から Web サービスをホストする必要がある場合、ペイロード モードの CXF は非常に適切であり、ほとんど同じように動作します。

from("cxf:somename:http://localhost:8765?wsdl=somewsdlfile.wsdl&dataFormat=PAYLOAD")

すでに Java でサービスを定義している場合は、Jetty コンポーネントでSOAP データ形式を使用して、非常に軽量なソリューションを実現できます。

SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new      ServiceInterfaceStrategy(CustomerService.class));
from("jetty:http://localhost:9832/soapsrv")
  .marshal(soap) // and other transforms here
  .to("http://somerestservicehost/srv");

または。CXF または CXF-bean を使用した完全な CXF ソリューションを使用してください。ラクダのウェブサイトにはたくさんの例があります。ただし、コンポーネントはかなり大きく、やや扱いにくい場合があります。

休息についても選択肢はありますが、その部分はより単純です。Rest は、いくつかのコンテンツを作成すること (soap メッセージからコンテンツを抽出し、おそらく xml を json にマップすることによって) に大きく関係しています。次に、残りのサーバーに対して HTTP エンドポイントを呼び出すだけです。HTTP4 または HTTP コンポーネントは、この多くのことを行います。

CXFRS は、CXF が好きな場合に適しています。特にクラスを使用して残りのサービスをモデル化する場合は、いくつかの支援を提供できます。

于 2012-07-13T15:33:01.190 に答える