2011-08-06 109 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