2016-01-26 2 views
2

Мои заголовки неправильно передаются от клиента к серверу при использовании JerseyTest.Клиент JerseyTest с MessageBodyWriter не передает заголовки на мою серверную часть MessageBodyReader

Оба сервера и клиент имеют MessageBodyWriter и MessageBodyReader, сконфигурированные соответственно с JerseyTest::configure и JerseyTest::configureClient.

MessageBodyWriter Мой добавить некоторые пользовательские заголовки для запроса:

@Override 
public void writeTo(MyPojo myPojo, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { 
    httpHeaders.put("X-Custom-Header", singletonList(myPojo.header())); 
} 

MessageBodyReader но когда поражен сервером, он содержит только стандартные заголовки.

Любые подсказки о том, что мне не хватает?

+0

Вы [зарегистрировали автора с клиентом] (https://gist.github.com/psamsotha/3c44023743812377fcc5#file-headerstest-java-L112). Он не будет отображаться на стороне клиента с помощью аннотации @ @ Provider, как это делается на сервере. –

+0

На самом деле, снова прочитав свой вопрос, похоже, что вы переопределили configureClient. Используете ли вы клиент, предоставленный методом «target()», или вы создаете собственный «Клиент»? В любом случае, приведенная выше ссылка имеет рабочий пример –

+0

thx для вашей помощи , но с версией версии 2.22.1 Джерси ваш сбой неудачен 'Ожидаемый: заголовок: объект' ' Фактическое: null: entity' –

ответ

1

Ok кажется ошибка с InMemoryConnector:

public ClientResponse apply(final ClientRequest clientRequest) { 
    PropertiesDelegate propertiesDelegate = new MapPropertiesDelegate(); 

    final ContainerRequest containerRequest = new ContainerRequest(baseUri, 
      clientRequest.getUri(), clientRequest.getMethod(), 
      null, propertiesDelegate); 

    containerRequest.getHeaders().putAll(clientRequest.getStringHeaders()); 

    final ByteArrayOutputStream clientOutput = new ByteArrayOutputStream(); 
    if (clientRequest.getEntity() != null) { 
     clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() { 
      @Override 
      public OutputStream getOutputStream(int contentLength) throws IOException { 
       final MultivaluedMap<String, Object> clientHeaders = clientRequest.getHeaders(); 
       if (contentLength != -1 && !clientHeaders.containsKey(HttpHeaders.CONTENT_LENGTH)) { 
        containerRequest.getHeaders().putSingle(HttpHeaders.CONTENT_LENGTH, String.valueOf(contentLength)); 
       } 
       return clientOutput; 
      } 
     }); 

Все стандартные заголовки устанавливаются с помощью:

containerRequest.getHeaders().putAll(clientRequest.getStringHeaders());

Но если вы предоставляете собственные заголовки, они читают, но никогда не добавляют к containerRequest:

final MultivaluedMap<String, Object> clientHeaders = clientRequest.getHeaders();

также https://java.net/jira/browse/JERSEY-2341 подскажите, что скоро не будет исправлено.

Смежные вопросы