2

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,并且我想避免将任何特定的依赖项定义为接口的一部分。

4

1 回答 1

1

JAX-RS 方式是实现您自己ContextResolverMyInterface. 然后,您可以在已解析的上下文中管理上下文的实现。上下文解析器是提供者,由 Jersey 管理,但不是 MyInterface 实现。

于 2013-06-07T19:22:23.180 回答