我有一堆爲新的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:...」)被執行。但緊接着,對注入的DataWarehouseService
的dwh.logApiRequest(cr)
的調用失敗,出現空指針 - 顯然注入失敗?!
這裏有什麼問題?我認爲,ResourceFilters
管理和可以使用CDI。我錯了嗎?
所有這些都運行在Glassfish 3.1.1上,Jersey 1.8是JAX-RS的提供者。如果我使用@Inject
,它會有所作爲嗎?
一個小的評論,因爲'DataWarehouseService'沒有實現任何業務接口'@LocalBean'是多餘的。如果有一個業務接口,並且你想在你的bean上添加一個額外的'無接口視圖',這是唯一必需的。 –