Jersey (および一般的な JAX-RS) では、次のように単純な依存性注入が可能です。
@Path("/")
public class MyResource {
@Context private Application application;
...
}
Jersey は最初にクラスを作成し、次に依存関係をバインドします。これは、ライフサイクルを完全に制御するインスタンスに再利用できるメカニズムですか?
たとえば、いくつかの未知の実装を持つインターフェースを考えてみましょう。
public interface MyInterface {
public boolean isHappy();
}
たとえば、ExceptionMapper などのプロバイダー シングルトンの 1 つにこれらのリストがあるとします。アプリケーションのサブクラスで初期化されます。
@Provider
public class MyExceptionMapper implements ExceptionMapper<Exception> {
private List<MyInterface> list;
public ExceptionMapper(List<MyInterface> list) {
this.list = list;
}
@Override
public Response toResponse(Exception e) {
for (MyInterface item : list) {
// Manually bind dependencies here?
if (item.isHappy()) {
return Response.ok("Nope, no errors here. Promise.").build();
}
}
return Response.serverError().build();
}
}
最後に、アプリケーションへのアクセスを必要とするこのインターフェースの特定の実装があるとします。
public class MyImplementation implements MyInterface {
@Context private Application application; // Can't do this
@Override
public boolean isHappy() {
MyApplication myApp = (MyApplication) application;
return myApp.shouldIgnoreExceptions(); // NullPointerException
}
}
インターフェイスのすべての実装のコンテキストをバインドする方法はありますか? それとも、Jersey がすべての実装を (プロバイダーにすることで) 管理できるようにする方法を見つける必要がありますか? または、依存性注入を実行するために CDI に頼る必要がありますか?
私は Jersey 1.17.1 を使用していることに注意してください。特定の依存関係をインターフェイスの一部として定義することは避けたいと思います。