2011-08-06 10 views
3

新しい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を使用した場合は違いがありますか?

+1

'DataWarehouseService'はビジネスインタフェースを実装していないので、小さなコメントです。' @ LocalBean'は冗長です。これはビジネスインターフェースがあり、あなたのbeanに 'no-interface view 'を追加したい場合にのみ必要です。 –

答えて

2

私はばかです。

@Stateless注釈をLoggingResourceFilterに追加すると修正されました。

+0

それは役に立ちません。 : - | – ehsun7b

関連する問題