Как вставить запрос Grizzly в Джерси ContainerRequestFilter

У меня есть Джерси, предоставленный Гризли.

у меня есть ContainerRequestFilter класс реализации. Однако этот класс создается один раз для всех входящих запросов. Поэтому делаем это:

public class EndpointRequestFilter implements ContainerRequestFilter {
    @Context
    private org.glassfish.grizzly.http.server.Request requestContext;

    public void filter( ContainerRequestContext req ) throws IOException {
       // remove for sake of example
    }
}

requestContext нулевой. Я могу добавить контекст в вызываемую конечную точку, но это довольно грубо и безобразно и действительно бесполезно для меня; как я хочу регистрировать различные запросы. В идеале хотелось бы добраться до этого Request объект на стороне ResponseFilter запроса.

Там должен быть простой способ сделать это. Все вопросы / ответы, которые я видел до сих пор, не работают для Grizzly и не внедряются в метод, вызываемый конечной точкой REST. Я не хочу обойти все мои сотни методов, добавляя это в вызов только потому, что я хочу получить IP-адрес!

Так какой здесь ключ? Что мне не хватает?

1 ответ

Решение

Я удивлен, что вы даже запустили приложение, чтобы добраться до точки, где вы могли бы узнать, что запрос нулевой. Всякий раз, когда я пытался запустить его, я получал исключение при запуске, говоря, что нет объема запроса, поэтому запрос не может быть введен, что я и ожидал. Хотя я не смог воспроизвести NPE, я думаю, что это решение все равно решит вашу проблему.

Итак Request является объектом области запроса, так как он изменяется при каждом запросе. Но фильтр по своей природе - одиночка. Итак, что вам нужно сделать, это лениво восстановить его. Для этого мы можем использовать javax.inject.Provider, как ленивый поисковый механизм.

Возвращаясь к сути моего первого абзаца, это было исключение, которое я получил при запуске

java.lang.IllegalStateException: не находится внутри области запроса.

Это имеет смысл, так как Request необходимо связать с областью запроса, а при запуске ее нет. Область запроса присутствует только во время запроса.

Так что с помощью Provider делает, это позволяет нам попытаться захватить Request когда присутствует область запроса.

public static class Filter implements ContainerRequestFilter {

    @Context
    private javax.inject.Provider<Request> requestProvider;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final Request request = requestProvider.get();
        System.out.println(request.getRemoteAddr());
    } 
}

Я проверил это, и он работает как ожидалось.

Смотрите также:

Другие вопросы по тегам