0

私は次のようなサーブレットを作成します。

public class GuiceApplicationServlet extends AbstractApplicationServlet {

    protected Provider<Application> applicationProvider;

    public GuiceApplicationServlet() {
        System.out.println("TTest");
    }

    @Inject
    public GuiceApplicationServlet(Provider<Application> applicationProvider) {
        super();
        this.applicationProvider = applicationProvider;
        System.out.println("Test");
    }

    @Override
    protected Class<? extends Application> getApplicationClass()
            throws ClassNotFoundException {
        return Application.class;
    }

    @Override
    protected Application getNewApplication(HttpServletRequest request)
            throws ServletException {
        return applicationProvider.get();
    }
}

web.xml:

    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>pl.koziolekweb.vaadin.guice.servlet.VaadinGuiceConfiguration</listener-class>
    </listener>


    <servlet>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <servlet-class>pl.koziolekweb.vaadin.guice.servlet.GuiceApplicationServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

問題は、jettyを実行すると、Guiceがサーブレットのインスタンスを作成します(コンソールで「Test」を出力)が、ブラウザでアプリケーションを実行しようとすると、NPEが表示され、コンソールに「TTest」が表示されます。

したがって、jettyは、guiceによって管理されていないサーブレットの別のインスタンスを作成します。

質問は、guiceのみを使用するように桟橋を構成する方法ですか?

4

3 に答える 3

2

拡張するguiceサーブレットモジュールを作成する必要がありますcom.​google.​inject.​servlet.ServletModule(これを呼び出しましょうFooModule)。そこで、メソッドをオーバーライドすることにより、サーブレットへのバインディングとパスを定義しますconfigureServlets()

次に、拡張してコンテキストリスナーを作成する必要がありますcom.google.inject.servlet.GuiceServletContextListener(これを呼び出しましょうBarContextListener)。getInjector()そこで、次のようなメソッドを実装する必要があります。

protected Injector getInjector() {
        Injector injector = Guice.createInjector(new FooModule());
        return injector;
    }

次に、web.xmlからすべてのサーブレットマッピングを削除し、フィルターを配置します。

   <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

およびコンテキストリスナー作成したもの:

<listener>
        <listener-class>path.to.package.of.context.listener.BarContextListener</listener-class>
    </listener>

これにより、すべてのサーブレットがGuiceによって管理され、アプリケーションのサーバー側で依存性注入が可能になります。Tomcatで動作するので、Jettyでも動作するはずです。guice-servlet-<version>.jarクラスパスに含めることを忘れないでください。私はVaadinでそれを使用しませんでしたが、私の答えはあなたに少し役立ったと思います。

于 2011-02-28T10:14:50.327 に答える
0

Guiceはすべてのサーブレットインスタンスを作成する必要があるため、ファイルからエントリを削除する必要がservletありservlet-mappingますweb.xml

于 2011-02-28T09:25:37.400 に答える
0

私はこのテーマに関するブログ投稿を書きました、それが最も役立つと確信しています:

Vaadin + GAE+Guice-サーブレット-チュートリアル

于 2012-09-26T16:33:26.203 に答える