Как вставить запрос 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());
}
}
Я проверил это, и он работает как ожидалось.
Смотрите также: