У меня есть куча ресурсов JAX-RS, которые предоставляют API для нового WebService.Чтобы понять, что происходит, я хотел бы хранить информацию о каждом запросе в хранилище данных.На мой взгляд, это прекрасный пример для сквозной задачи, которая может быть реализована с помощью ResourceFilter
, верно?
Так что я построил 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, выполняется оператор log («Incoming request: ...»).Но сразу после этого вызов введенного DataWarehouseService
dwh.logApiRequest(cr)
завершается неудачно с нулевым указателем - очевидно, что инъекция не удалась?!
В чем здесь проблема?Я думал, что ResourceFilters
управляются и могут использовать CDI.Я ошибся?
Все это работает на Glassfish 3.1.1, Jersey 1.8 - поставщик JAX-RS.Будет ли иметь значение, если я использовал @Inject
?