2

現在、既存の JBoss EJB アプリケーションを純粋なサーブレット ソリューションに移植しています。このソリューションは、Jetty (現在バージョン 6 を使用していますが、バージョンはほとんど関係ありません) で実行され、依存性注入と AOP に Guice を使用します。非常に複雑であるにもかかわらず、これまでのところ非常にうまくいっています。永続化レイヤーと、JAX-RS REST サービスを含むほとんどのサービスが稼働しています。

しかし、既存の JAX-WS SOAP サービスの移植を開始したとき、問題が発生しました。すでに約 1 日かけて Web を検索しましたが、何年も前に多くの人が同じ問題に遭遇したようです。しかし、誰も良い解決策を提供していないようです。

アーキテクチャの詳細

GuiceServletContextListenerを使用して、すべてのモジュールで構成されたグローバル インジェクターを作成しています。シングルトンをサポートする必要があるため、インジェクターを 1 つだけにすることが重要です。

私たちが知る限り、具体的な JAX-WS 実装は関係ありません。現在、Metro で実験していますが、おそらく Apache-CXF を使用することもできます。

これまでに評価されたアプローチ

このスタックオーバーフローの投稿では、サービスを手動で作成し、Endpoint.publish(...) を介して公開することを提案しています。ただし、Jetty コンテナーを使用せず、独自の HTTP サーバーを起動するため、これは受け入れられるソリューションではありません。

final Module module = new HelloModule();
final Injector injector = Guice.createInjector(module);
final HelloService helloService = injector.getInstance(HelloService.class);
Endpoint.publish("http://localhost:8080/helloService", helloService);

同じスタックオーバーフローの投稿では、 JAX-WS Guice 統合を使用することも提案されていますが、これは一般的に良いアプローチのように思えます。ただし、このソリューションは独自のインジェクターを作成するため、GuiceServletContextListener ベースのアプローチとは互換性がありません。まったく同じ問題が議論されているこのスレッドを見つけましたが、誰も解決策を持っていないようです.

また、Apache-CXF を Guice アプリケーションに簡単に統合できるようにするguice-cxfについても調べましたが、説明を理解する限り、これは今のところ JAX-RS REST サービスに対してのみ機能します。

これ以上時間を無駄にせず、車輪の再発明を試みるために、この質問をここに投稿しました. どんな助けでも大歓迎です。

4

1 に答える 1

3

CXFNonSpringServletを拡張することで、最終的に非常にエレガントに解決しました。すべてのサービス エンドポイントを構成できる loadBus() メソッドをオーバーライドするだけです。

@Singleton
public class SoapServlet extends CXFNonSpringServlet {
    private static final long serialVersionUID = 1L;

    private final SomeFacade someFacade;

    @Inject
    SoapMachineServlet(final SomeFacade someFacade) {
        this.someFacade = someFacade;
    }

    @Override
    public void loadBus(ServletConfig servletConfig) throws ServletException {
        super.loadBus(servletConfig);

        Bus bus = getBus();
        BusFactory.setDefaultBus(bus);
        Endpoint.publish("/SomeFacade", someFacade);
    }
}

クラス自体は単なるサーブレットであり、ServletModuleを使用してバインドできます。

public class SomeModule extends ServletModule {
    @Override
    protected void configureServlets() {
        serve("/some/path*").with(SoapServlet.class);
    }
}
于 2013-07-26T12:25:38.010 に答える