新しいWebService用のAPIを提供するJAX-RSリソースがたくさんあります。何が起きているのかを理解するために、私は各要求に関する情報をデータウェアハウスに保存したいと考えています。私の考えでは、これはクロスカット問題の完全な例です。これはResourceFilter
で実装できますか?ResourceFilterへの依存性注入が機能していませんか?
は、だから私は、DB内のものを保管することになっているDataWarehouseService
を建て:
@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)
フィルタインジェクションは正常に動作します.JAX-RSリソースの1つにアクセスすると、ログステートメント(「着信要求:...」)が実行されます。しかしすぐに、注入されたDataWarehouseService
のコールはdwh.logApiRequest(cr)
がNullpointerで失敗します - 明らかに注入が失敗しましたか?
ここで問題は何ですか?私は、ResourceFilters
が管理され、CDIを使用できると考えました。私が間違っている?
これらはすべてGlassfish 3.1.1で動作し、Jersey 1.8はJAX-RSプロバイダです。 @Inject
を使用した場合は違いがありますか?
'DataWarehouseService'はビジネスインタフェースを実装していないので、小さなコメントです。' @ LocalBean'は冗長です。これはビジネスインターフェースがあり、あなたのbeanに 'no-interface view 'を追加したい場合にのみ必要です。 –