Jersey(以及一般的 JAX-RS)允许简单的依赖注入,如下所示:
@Path("/")
public class MyResource {
@Context private Application application;
...
}
Jersey 首先创建类,然后将依赖项绑定到它。这是一种我可以为我完全控制其生命周期的实例重复使用的机制吗?
例如,考虑一个具有一些未知实现的接口。
public interface MyInterface {
public boolean isHappy();
}
假设我的一个提供者单例中有一个这些列表,例如,一个 ExceptionMapper。它将在应用程序的某个子类中初始化。
@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,并且我想避免将任何特定的依赖项定义为接口的一部分。