Получить запрос в методе Resteasy JAX-RS

1

У меня есть служба Jax-Rs, которую я запускаю с помощью Resteasy, а также в реализации методов, которые я хочу получить для данных запроса. Я знаю о существовании аннотации @Context, но для этого требуется изменить интерфейс службы, который не является практичным (или даже возможно с клиентами Java Jax-Rs), которые используют один и тот же интерфейс для создания прокси-сервера клиента.

Поэтому, чтобы сделать его более чистым, у меня есть этот интерфейс, который я не могу изменить.

@POST
@Path("/ping")
@Consumes({ javax.ws.rs.core.MediaType.APPLICATION_JSON, javax.ws.rs.core.MediaType.APPLICATION_XML })
@Produces({ javax.ws.rs.core.MediaType.APPLICATION_JSON, javax.ws.rs.core.MediaType.APPLICATION_XML })
public String ping();

И в реализации я хочу сделать что-то вроде этого (вроде псевдокода)

@Override
public String ping() {
    String client = SomeContextAccessor.getRequest().getRemoteAddress());

    //Use the request info

    return "a nice string";
}

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

  • 0
    Согласно javadoc , @Context имеет `@Target (value = {PARAMETER, METHOD, FIELD} . So you could try using аннотацию @ Context` с полем и получать данные из этого поля в методе обработчика. Это может позволить вам получить доступ к контексту без необходимости изменять сигнатуры любых методов.
  • 0
    К сожалению, это не очень помогает. Я не вижу методов, которые бы возвращали фактический HTTP-запрос для меня. Я думаю, @Context это не то, что я ищу. Нужно расследовать. Но в то же время вопрос остается в силе.
Показать ещё 4 комментария
Теги:
rest
httprequest
jax-rs

1 ответ

2
Лучший ответ

Решение представляет собой одну строку:

ResteasyProviderFactory.getContextData(HttpServletRequest.class)

Я не знаю, возможна ли инъекция этого в поле. Впрыск уровня метода не работает, поскольку я использую Java-клиенты с тем же определением интерфейса. Добавление параметров контекста к методу испортило бы эту схему.

Во всяком случае, он отлично работает для меня.

  • 0
    Результаты инъекций в синглетонах? С каких пор? Возможно область применения @Application. @GET @Path("{foo}") public void getFoo(@Context HttpServletResponse response, ...)
  • 0
    Более того, ваш путь зависит от RestEasy. Инъекция стандартизирована.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню