dependency injectionResourceFilter不起作用?
我有一堆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 ... } }
这是我的filter:
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)
将filter注入到我的JAX-RS资源中。
Filter-injection工作正常,当我访问其中一个JAX-RS资源时,会执行日志语句(“Incoming request:…”)。 但紧接着,对注入的DataWarehouseService
的dwh.logApiRequest(cr)
的调用因dwh.logApiRequest(cr)
失败 – 显然注入失败了?!
这有什么问题? 我想, ResourceFilters
是管理的,可以使用CDI。 我错了吗?
所有这些都在Glassfish 3.1.1上运行,Jersey 1.8是JAX-RS提供商。 如果我使用@Inject
会有所作为吗?
好吧,我是个白痴。
将LoggingResourceFilter
注释添加到LoggingResourceFilter
修复它。