java - 带有 MessageBodyWriter 的 JerseyTest 客户端不会将 header 传递到我的 MessageBodyReader 服务器端

标签 java jersey jax-rs jersey-test-framework

使用 JerseyTest 时,我的 header 未从客户端正确传递到服务器。

服务端和客户端都分别配置了MessageBodyWriterMessageBodyReaderJerseyTest::configureJerseyTest::configureClient.

我的 MessageBodyWriter 添加一些自定义 header 以进行查询:

@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 被服务器命中时,它只包含标准 header 。

关于我遗漏了什么的任何线索?

最佳答案

好的,这似乎是 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;
            }
        });

所有标准 header 都设置为:

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

但是如果您提供自定义 header ,它们会被读取但不会添加到 containerRequest :

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

还有https://java.net/jira/browse/JERSEY-2341建议不会很快修复。

关于java - 带有 MessageBodyWriter 的 JerseyTest 客户端不会将 header 传递到我的 MessageBodyReader 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013157/

相关文章:

java - 如何使用 JNDI 从 ldap 获取数据

java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序

java - 将文件保存到 Jersey API 中的服务器应用程序目录

java - 错误 : java. lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap

java - JAXB - @XMLTransient 字段在返回到 UI 时消失

Java Jersey PathParams 检查和 NotFoundException 自定义消息

java - 我的主要方法有什么问题?

java - Hadoop 集群设置 - java.net.ConnectException : Connection refused

java - 将 RGBA 颜色设置为布局

java - 严重 : MessageBodyWriter not found for media type=application/json, 类型=com.jersey.jaxb.Todo 类,genericType=com.jersey.jaxb.Todo 类