Внедрение зависимостей в ResourceFilter не работает? - PullRequest
4 голосов
/ 06 августа 2011

У меня есть куча ресурсов 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?

1 Ответ

2 голосов
/ 06 августа 2011

Хорошо, я идиот.

Добавление аннотации @Stateless к LoggingResourceFilter исправило ее.

...