Я реализую пользовательский MessageBodyReader
, который должен разрешать URI по отношению к URI запроса во время обработки.Если MessageBodyReader
используется в реализации JAX-RS server , например,обрабатывая входящие POST-запросы, я могу получить URI запроса от UriInfo
объекта, который вводится во время выполнения с использованием @Context
(как описано, например, в https://stackoverflow.com/a/3314076):
public class MyProvider implements MessageBodyReader {
@javax.ws.rs.core.Context
javax.ws.rs.core.UriInfo uriInfo;
@Override
public Iterable<URI> readFrom(Class<Iterable<URI>> clazz, Type genericType,
Annotation annotations[], MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
URI requestURI = uriinfo.getAbsolutePath(); // NPE if called in a client
// Parsing entityStream resolving relative URIs using requestURI
}
}
Если MessageBodyReader
вызывается в реализации JAX-RS client во время чтения сущности Response
, инъекция не происходит, поэтому я получаю NullPointerException
(стр. см. выше), когда пишуклиент, использующий JAX-RS, такой как:
Iterable<URI> it = ClientBuilder.newClient().target("http://example.org/").request().get()
.readEntity(new GenericType<Iterable<URI>>(){});
С целью разрешения URI мой вопрос:
Как узнать URI запроса в readFrom(...)
вслучай, когда MessageBodyReader
вызывается в реализации клиента JAX-RS ?
Мой текущий обходной путь: Прочитав Глава 10.4 "Фильтр"и порядок выполнения перехватчика " документации Джерси, я обнаружил, что на шаге 16, ClientResponseFilter
, у меня есть доступ как к URI запроса, так и к заголовкам ответа. Поэтому я написал ClientResponseFilter
, который помещает URI запросав пользовательском заголовке ответа. Затем я могу получить этот пользовательский заголовок из5-й параметр readFrom(...)
.