3

HK2インジェクションを使用してJersey / Jettyのセットアップを機能させる方法をハックすることができましたが、見つけた膨大な数のやや紛らわしい(そして時には一貫性のない)ドキュメントを考えると、いくつか見逃したかどうかはわかりませんそれを正しくするための顕著な詳細..現状では、このようにサーブレットをブートストラップしています。

        // Jersey
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
        ServletContainer jerseyServletContainer = new ServletContainer(new AppResourceConfig());
        ServletHolder jerseyServletHolder = new ServletHolder(jerseyServletContainer);
        servletContextHandler.setContextPath("/");
        servletContextHandler.addServlet(jerseyServletHolder, "/api/*");

        // Wire up Jetty
        HandlerCollection handlerList = new HandlerCollection();
        handlerList.setHandlers(new Handler[]{ servletContextHandler });
        Server server = new Server(configuration.getInt("Server.Port"));
        server.setHandler(handlerList);
        server.start();
        server.join();

AppResourceConfig を次のように定義します。

public class AppResourceConfig extends ResourceConfig {
    public AppResourceConfig() {
        register(new AppBinder());
        packages("org.sandbox.resources");
    }
}

そして私のAppBinderとして;

public class AppBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(new StringService()).to(StringService.class);
    }
}

これはすべて私の単純なテストケースで機能しますが、いくつかの点が不明です。Jersey のドキュメントは、私が拡張すべき Application クラスを参照し、Injections.addBinding を使用してバインディングをセットアップします。ただし、これを行うために、@Inject を使用して ServiceLocator インスタンスをコンストラクターに取得しています。そして、彼らはバインダーをまったく作成していないように見えますか? ( https://jersey.java.net/documentation/latest/migration.html -- 26.14.1.1. カスタム オブジェクトの注入)。

誰かが私のアプローチが正しいかどうかに光を当て、おそらく Application と ResourceConfig の違いと、フレームワークの意図との一貫性を保つために実際に何をすべきかについて教えてもらえますか?

4

1 に答える 1

3

Applicationは、Java EE 仕様で定義された REST API である JAX-RS の一部です。Jersey は、その API の 1 つの実装です。したがって、この標準Applicationを使用して、JAX-RS で定義されているように、Jersey で REST アプリケーションをセットアップできます。ResourceConfig拡張Applicationされ、Jersey による実装固有の機能強化です。コードで行ったように、たとえば、インジェクションを追加したり、スキャンするパッケージを追加したりするなど、セットアップが簡単になります。

リンクされたドキュメントはバインダーを使用しています。そうでない例は、古い Jersey 1.x を参照しています。org.glassfish.jersey.internal.inject.Injections他の例では、 (パッケージ名が示すように)使用すべきではない内部クラスであるクラスを使用していると思います。彼らがそれをドキュメントに含めた理由はわかりませんが、そこにあるべきではないと思います。たぶん、それはかつてパブリック API の一部だったのかもしれませんし、この例で行われていることを実行する方法が他にないのかもしれません。とにかく、そのクラスを使用しない方がよいでしょう。

あなたのアプローチはうまく見えます。RestEasy や Apache CFX などの他の JAX-RS フレームワークしか提供しない場合、純粋な JAX-RS に制限する代わりに Jersey API の機能を使用すると、コンテナー環境でのアプリの実行がより困難になる可能性があります。他のフレームワークをサポートする予定がない場合は、Jersey の利点を活用することをお勧めします。

于 2015-02-02T12:02:35.283 に答える