我正在使用RESTEasy 3
和Spring 4
,并尝试将@Autowired
服务bean注入到我的拦截器中,如下所示:
但是运行此代码,在访问我的访问服务时会返回Null Pointer Exception
:
@Provider
@MyAnnotationToIntercept
public class MyInterceptor implements ContainerRequestFilter {
private MyAccessService accessService;
@Autowired
public MyInterceptor(MyAccessService accessService) {
this.accessService = accessService;
}
public MyInterceptor() {
}
@Override
public void filter(ContainerRequestContext requestContext) {
// DO SOME STUFF Using accessService
}
}
@Component
public class MyAccessService {
private MyDep1 dep1;
@Autowired
public MyAccessService(Mydep1 dep1) {
this.dep1= dep1;
}
}
有什么办法可以做到这一点?真的有可能吗?
答案 0 :(得分:0)
您将需要使用WebApplicationContextUtils
的方法在过滤器内部获取一个不受spring管理的bean。这是示例
MyAccessService myAccessService = (MyAccessService) WebApplicationContextUtils.getRequiredWebApplicationContext(httpServletRequest .getServletContext()).getBean(MyAccessService.class);
要获取HttpServletRequest
实例,您可以使用@context
注入
@Context
private HttpServletRequest httpServletRequest ;
答案 1 :(得分:0)
好像您将@Autowired注释放置在错误的位置。它应该在accessService的声明之上。并且取决于您如何配置应用程序上下文,您可能会/可能不需要accessService实例变量的setter方法。