Как определить URI запроса в MessageBodyReader клиента JAX-RS? - PullRequest
0 голосов
/ 24 ноября 2018

Я реализую пользовательский 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(...).

...