我有一堆为新的WebService提供API的JAX-RS资源。为了理解发生了什么,我想将关于每个请求的信息存储在数据仓库中。在我看来,这是一个交叉问题的完美例子,可以通过ResourceFilter
来实现,对吗?依赖注入ResourceFilter不起作用?
所以我建了一个DataWarehouseService
这是应该保存的东西在DB:
@Stateless
@LocalBean
public class DataWarehouseService {
public void logApiCall(ContainerRequest cr) {
// get interesting fields from request, store in DB
...
}
}
这是我的过滤器:
public class LoggingResourceFilter implements ResourceFilter {
Logger log = Logger.getLogger(this.getClass().getName());
@EJB
DataWarehouseService dwh;
@Override
public ContainerRequestFilter getRequestFilter() {
return new ContainerRequestFilter() {
@Override
public ContainerRequest filter(ContainerRequest cr) {
log.info("Incoming request: "+
cr.getHeaderValue("user-agent") +" "+
cr.getMethod() +" "+
cr.getPath()
);
dwh.logApiRequest(cr);
return cr;
}
};
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
}
我注入过滤器进入我的JAX-RS通过注释资源@ResourceFilters(LoggingResourceFilter.class)
在课堂上。
Filter-injection工作正常,当我访问JAX-RS资源之一时,log语句(“Incoming request:...”)被执行。但紧接着,对注入的DataWarehouseService
的dwh.logApiRequest(cr)
的调用失败,出现空指针 - 显然注入失败?!
这里有什么问题?我认为,ResourceFilters
管理和可以使用CDI。我错了吗?
所有这些都运行在Glassfish 3.1.1上,Jersey 1.8是JAX-RS的提供者。如果我使用@Inject
,它会有所作为吗?
一个小的评论,因为'DataWarehouseService'没有实现任何业务接口'@LocalBean'是多余的。如果有一个业务接口,并且你想在你的bean上添加一个额外的'无接口视图',这是唯一必需的。 –