2011-08-06 3 views
3

새로운 WebService 용 API를 제공하는 JAX-RS 리소스가 많이 있습니다. 무슨 일이 일어나고 있는지 이해하기 위해 각 요청에 대한 정보를 데이터웨어 하우스에 저장하고 싶습니다. 내 생각에 이것은 교차 관심사에 대한 완벽한 예이며 ResourceFilter으로 구현할 수 있습니다. 맞습니까?ResourceFilter에 종속성 주입이 작동하지 않습니까?

@Stateless 
@LocalBean 
public class DataWarehouseService { 

    public void logApiCall(ContainerRequest cr) { 
     // get interesting fields from request, store in DB 
     ... 
    } 
} 

을 그리고 여기 내 필터입니다 :

은 그래서 DB에 물건을 저장하도록되어 이는 DataWarehouseService를 구축

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 리소스 중 하나에 액세스 할 때 잘 동작하며 로그 문 ("수신 요청 : ...")이 실행됩니다. 그러나 그 직후, 주입 된 전화 DataWarehouseServicedwh.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

관련 문제