2011-08-06 115 views
3

我有一堆为新的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:...”)被执行。但紧接着,对注入的DataWarehouseServicedwh.logApiRequest(cr)的调用失败,出现空指针 - 显然注入失败?!

这里有什么问题?我认为,ResourceFilters管理和可以使用CDI。我错了吗?

所有这些都运行在Glassfish 3.1.1上,Jersey 1.8是JAX-RS的提供者。如果我使用@Inject,它会有所作为吗?

+1

一个小的评论,因为'DataWarehouseService'没有实现任何业务接口'@LocalBean'是多余的。如果有一个业务接口,并且你想在你的bean上添加一个额外的'无接口视图',这是唯一必需的。 –

回答

2

好的,我是个白痴。

添加@Stateless注释到LoggingResourceFilter修复它。

+0

它不会帮助。 : - | – ehsun7b