我有一堆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
的{{1}}的调用因Nullpointer而失败 - 显然注入失败了?!
这里有什么问题?我想,dwh.logApiRequest(cr)
是受管理的,可以使用CDI。我错了吗?
所有这些都在Glassfish 3.1.1上运行,Jersey 1.8是JAX-RS提供商。如果我使用ResourceFilters
会不会有所作为?
答案 0 :(得分:2)
好的,我是个白痴。
将@Stateless
注释添加到LoggingResourceFilter
修复它。