我有,我想注入资源和过滤器一个POJO:定制供应商不能注入过滤
public final class MyObject { }
我实现了定制提供商:
@Provider
public final class MyProvider
extends AbstractHttpContextInjectable<MyObject>
implements InjectableProvider<Context, Type> {
@Context private HttpServletRequest request;
@Override
public Injectable<MyObject> getInjectable(
ComponentContext componentContext,
Context annotation,
Type type
) {
if (type.equals(MyObject.class)) {
return this;
}
return null;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public MyObject getValue(HttpContext httpContext) {
//in reality, use session info from injected request to create MyObject
return new MyObject();
}
}
的对象被成功地注入到我的资源:
@Path("/test")
@ResourceFilters(MyFilter.class)
public final class MyResource {
@Context private HttpServletRequest request;
@Context private MyObject myObject;
@GET
public String execute() {
System.out.println(request != null); //true
System.out.println(myObject != null); //true
return "data";
}
}
但泽西未能将其注入到我的过滤器:
public final class MyFilter implements ResourceFilter {
@Context private HttpServletRequest request;
@Context private MyObject myObject;
@Override
public ContainerRequestFilter getRequestFilter() {
return new ContainerRequestFilter() {
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
System.out.println(request != null); //true
System.out.println(myObject != null); //false
return containerRequest;
}
};
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
}
我猜差异有与事实MyFilter
注射是使用推迟到线程本地实例代理做的事 - 这是因为与@Context
注释字段在外部类中声明,它被实例化了一次,但是它们被用来在每个请求的基础上注入对象。当我在调试过程中,通过filter
步骤,我可以看到,MyFilter.request
指向代理包装的com.sun.jersey.server.impl.container.servlet.ThreadLocalInvoker
一个实例。
什么是我的自定义供应商(或执行其他)丢失,它需要做定制注入我的过滤器?
请注意,我现在坚持与新泽西1.1.4.1(对不起)。
编辑:使用泽西1.17,我在启动时得到一个异常,而不是:
重度:现场缺少相关性:私人mypackage.MyObject mypackage.MyFilter.myObject
这并没有真正使用Injectable方法。提供者可用作默认注入的一部分,您基本上需要向Jersey服务器注册一个自定义上下文解析器。您可以避免扩展AbstractHttpContextInjectable或实现InjectableProvider并获得相同的结果。 – baradas 2013-07-15 06:47:29
@baradas你是对的,这就是为什么我不喜欢这个解决方案。我没有最终在我的代码中使用它。 – 2013-07-15 15:31:25
@PaulBellora,如果我问,你最终做了什么?我在注入过滤器以及注入提供者方面遇到同样的问题。 – elanh 2015-10-11 12:54:13