Джерси — выполнить «общий» код перед запуском выбранного набора подресурсов.

У меня есть веб-приложение Java, которое использует Джерси для предоставления REST API.

@Path("/myRootResource")
public class resource
{
    @GET
    @Path("subResource_1")
    public Response subResource_1() {return null;}

    @GET
    @Path("subResource_2")
    public Response subResource_2() {return null;}
}

Я хочу запустить некоторый код для каждого подресурса в рамках определенного ресурса. Этот код обрабатывает задачи аутентификации, показатели производительности (например, время начала для расчета времени запроса), инициализацию и переменные отладки.

До сих пор весь код у меня был в функции (например, preTasks()), которую я запускал в начале каждого метода субресурса. Мне нужно как-то автоматизировать это и заставить этот блок кода работать для каждого подресурса myRootResource без необходимости копировать и вставлять вышеупомянутую функцию в каждый метод подресурса.

Можно ли это сделать с помощью фильтров или перехватчиков Джерси?

Хотя я не совсем знаком с Spring, я думаю, что то, чего я пытаюсь достичь, чем-то похоже на это: Веб-приложение Spring: выполнение общего кода перед входом в RequestMapping в контроллере

Обновление от 06.12.2015
Как указано в комментариях, «Перехватчики» — хороший способ. Но «Перехватчики» поддерживаются только из Джерси 2.X и выше. В моем коде я использую Джерси 1.18. Обновление до Jersey 2.X ломает часть моего кода, поэтому сейчас я стараюсь этого избегать.

Есть ли эквивалент «Перехватчикам» в Джерси 1.18, или мой единственный вариант — это обновление. Я думаю, что «Диспетчеры» могут приступить к работе, это правильно?


person Athafoud    schedule 11.06.2015    source источник
comment
вы нашли решение этого?   -  person tryingToLearn    schedule 21.09.2018
comment
@tryingToLearn Нет, я не нашел то, что искал. Как я уже говорил выше, у меня есть функция, в которой есть вся моя логика, и я каждый раз вызываю/повторно использую ее. Единственная «автоматизация», которую мне удалось сделать, это создать что-то вроде класса шаблона, в котором есть вся общая логика. Таким образом, любой новый класс основан на этом, однако рефакторинг может быть запутанным.   -  person Athafoud    schedule 23.09.2018
comment
Фильтры @Athafoud также не работали с майкой 1.18?   -  person tryingToLearn    schedule 24.09.2018
comment
@tryingToLearn Я не использовал фильтры, но не помню почему. Так что я не уверен, работают ли фильтры или нет.   -  person Athafoud    schedule 25.09.2018
comment
Стоит отметить, что на самом деле вам не нужно ничего вводить, когда вы используете аннотацию @Context; простая пометка вашего метода @Before с помощью @Context делает свое дело, если вы работаете в классе, которым управляет Джерси.   -  person RJStanford    schedule 10.05.2019


Ответы (2)


Я использую это:

/**
 * This method is called by JAX-RS for each request before the identified resource method is
 * invoked, since it is annotated with the Context annotation.
 */
@Context
public void setServletContext( ServletContext servletContext ) {

}

Я поместил это в классы ресурсов.

person gsl    schedule 12.06.2015

В дополнение к предыдущему ответу, чтобы получить запрос, ответ и сеанс:

@Context
public void setServletContext(
                ServletContext servletContext,
                @Context final HttpServletRequest request,
                @Context final HttpServletResponse response
) {
    // you can also get to the session
    // it is recommended to uncomment the "false" argument below
    // to avoid creating sessions if they don't already exist
    HttpSession session = request.getSession(/*false*/);
}

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

person jakubiszon    schedule 28.10.2018
comment
request.getSession() не только получает сеанс, но и создает сеанс, если он еще не существует! Это особенно важно, поскольку мы обычно работаем без сеансов в REST, верно? Вариант request.getSession(false) не создаст сеанс, если он не существует, но вернет null. Но опять же, старайтесь избегать сессий, так как это REST. - person gsl; 11.12.2018
comment
Вы правы @gsl - сеансов следует избегать. Просто иногда нам приходится их использовать из-за существующей инфраструктуры. - person jakubiszon; 11.12.2018