2016-06-10 6 views
1

У меня есть Джерси, предоставляемый Grizzly.Как вводить Grizzly Request в Jersey 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-адрес!

Так что это за ключ? Что мне не хватает?

ответ

2

Я удивлен, что вы даже запустили приложение, чтобы добраться до точки, где вы можете узнать, что запрос равен нулю. Всякий раз, когда я пытался запустить его, я получал исключение при запуске, говоря, что нет области запроса, поэтому запрос не может быть введен, и это то, что я ожидал. Хотя я не мог воспроизвести 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()); 
    } 
} 

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

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

+0

Хороший материал спасибо. Ключом к его работе было обернуть его в классе Provider. Это сделало трюк. –

+0

@peeskillet удивительное решение, спасибо вам большое! –

Смежные вопросы