새로운 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 리소스 중 하나에 액세스 할 때 잘 동작하며 로그 문 ("수신 요청 : ...")이 실행됩니다. 그러나 그 직후, 주입 된 전화 DataWarehouseService
의 dwh.logApiRequest(cr)
은 Nullpointer로 실패합니다 - 분명히 주입이 실패 했나요?!
여기에 문제가 있습니까? 나는 ResourceFilters
이 (가) 관리되고 CDI를 사용할 수 있다고 생각했습니다. 내가 잘못?
이 모두 Glassfish 3.1.1에서 실행되며 Jersey 1.8은 JAX-RS 제공 업체입니다. @Inject
을 사용하면 차이가 있습니까?
'DataWarehouseService'가 어떤 비즈니스 인터페이스도 구현하지 않았기 때문에 작은 주석입니다. '@ LocalBean'은 중복되어 있습니다. 이것은 비즈니스 인터페이스가 있고 bean에 추가 'no-interface view'를 원할 때만 필요합니다. –