我有一堆JAX-RS资源,为新的WebService提供API.为了理解发生了什么,我想将有关每个请求的信息存储在数据仓库中.在我看来,这是一个跨领域关注的完美范例,可以通过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;
}
}
我通过类级别上的注释@ResourceFilters(LoggingResourceFilter.class)将过滤器注入我的JAX-RS资源.
Filter-injection工作正常,当我访问其中一个JAX-RS资源时,日志语句(“Incoming request:…”)被执行.但紧接着,对注入的DataWarehouseService的dwh.logApiRequest(cr)的调用因Nullpointer而失败 – 显然注入失败了?!
这有什么问题?我想,ResourceFilters是可以管理的,可以使用CDI.我错了吗?
所有这些都在Glassfish 3.1.1上运行,Jersey 1.8是JAX-RS提供商.如果我使用@Inject会有所作为吗?
解决方法:
好吧,我是个白痴.
将@Stateless注释添加到LoggingResourceFilter修复它.