6

Jersey 2 を使用して REST API を開発しています。一部のクラスは、リソース要求によってトリガーされたときだけでなく、起動時にインスタンス化する必要があります。

だから私が求めているのはSomethingImpl、誰かが何かのリソースにヒットしたときだけでなく、サーバーの起動時にここで定義されたインスタンスが作成されるようにするにはどうすればよいですか? Guice では、 を使用します.asEagerSingleton()

応用:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(" else").to(String.class);
                bind(SomethingImpl.class).to(Something.class).in(Singleton.class);
            }
        });

        register(SomeResource.class);
    }
}

何か:

public interface Something {
   String something();
}

public class SomethingImpl implements Something {
    @Inject
    public SomethingImpl(final String something) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println(something() + something);

                    try {
                        Thread.sleep(4000);

                    } catch (final InterruptedException e) {
                        break;
                    }
                }
            }
        }).start();
    }

    @Override
    public String something() {
        return "Something";
    }
}

いくつかのリソース:

@Path("/")
public class SomeResource {
    private final Something something;

    @Inject
    public SomeResource(final Something something) {
        this.something = something;
    }

    @GET
    @Path("something")
    public String something() {
        return something.something();
    }
}
4

3 に答える 3

5

Jersey と統合された hk2 の新しいリリース (ただし、すぐに統合されます) では、@Immediate とマークされたサービスを使用できます。これらは基本的に hk2 に追加されるとすぐに開始されます。ただし、これを機能させるには、Immediate コンテキストをシステムに追加する必要があります (例: https://hk2.java.net/2.2.0-b27/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html )。 #enableImmediateScope%28org.glassfish.hk2.api.ServiceLocator%29 )

このスコープ/コンテキストのペアをデフォルトで有効にするよう、Jersey チームに働きかけることをお勧めします (PerThread スコープなどは既に有効になっています)。

この問題を作成しました: https://java.net/jira/browse/JERSEY-2291は、Jersey がデフォルトで @Immediate サービスを有効にするように要求します。

于 2013-12-21T17:40:57.283 に答える
0

msknapp が言ったことに加えて、web.xml にリスナーを追加する必要がないように、サーブレット コンテキスト リスナーに@WebListenerを使用することもできます。次に、リスナーは次のようになります

@WebListener
public class SomethingListener implements ServletContextListener {
    @Inject
    private final Something something;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //put code about something here
    }
}
于 2013-12-21T01:59:34.640 に答える