У меня есть служба 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";
}
Я знаю, что есть несколько классов со статическими методами, которые позволяют мне это делать, но не могут найти информацию о них.
Решение представляет собой одну строку:
ResteasyProviderFactory.getContextData(HttpServletRequest.class)
Я не знаю, возможна ли инъекция этого в поле. Впрыск уровня метода не работает, поскольку я использую Java-клиенты с тем же определением интерфейса. Добавление параметров контекста к методу испортило бы эту схему.
Во всяком случае, он отлично работает для меня.
@GET @Path("{foo}") public void getFoo(@Context HttpServletResponse response, ...)
@Context
имеет `@Target (value = {PARAMETER, METHOD, FIELD}. So you could try using
аннотацию @ Context` с полем и получать данные из этого поля в методе обработчика. Это может позволить вам получить доступ к контексту без необходимости изменять сигнатуры любых методов.