java - Jersey /JAX-RS : Return Content-Length in response header instead of chunked transfer encoding

标签 java rest jaxb jersey jax-rs

我正在使用 Jersey 创建 RESTful API 资源,并使用 ResponseBuilder 生成响应。

RESTful 资源的示例代码:

public class infoResource{
  @GET
  @Path("service/{id}")
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getCompany(@PathParam("id")String id) {
      //company is just a POJO.
      Company company = getCompany(id);
      return Response.status(200).entity(company).build();  
  }
}

在响应中,它在响应 header 中返回分块传输编码。在“ Jersey 世界”中,让它返回 Content-Length header 而不是响应 header 中的 Transfer-Encoding: chunked header 的正确方法是什么?

最佳答案

选择 Content-LengthTransfer-Encoding 只是容器的选择。这实际上是缓冲区大小的问题。

一个可能的解决方案是提供一个 SevletFilter,它缓冲所有这些编码字节并设置 Content-Length header 值。

参见 this page .

@WebFilter
public class BufferFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
        throws IOException, ServletException {

        final ByteArrayOutputStream buffer =
            new ByteArrayOutputStream();

        // prepare a new ServletResponseWrapper
        // which returns the buffer as its getOutputStream();

        chain.doFilter(...)

        // now you know how exactly big is your response.

        final byte[] responseBytes = buffer.toByteArray();
        response.setContentLength(responseBytes.length);
        response.getOutputStream().write(responseBytes);
        response.flush();
    }

    @Override
    public void destroy() {
    }
}

关于java - Jersey /JAX-RS : Return Content-Length in response header instead of chunked transfer encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659330/

相关文章:

jakarta-ee - 未公开动态 Web 模块和 gradle API

java - 为什么一个线程一旦启动,它就永远不能在java中再次启动

java - 无法计算构建计划 : Plugin org. apache.maven.plugins :maven-resources-plugin:2. 5 或其依赖项之一无法解析

java - 故障安全迭代器 : Memory Penalties?

java - 使用 JAX-RS 和 DTO 参数进行 Bean 验证

java - 动态设置媒体类型@Produces注释值

java - `@XmlRootElement` 和 `nillable`

java - 正则表达式匹配语句内的字母以组成单词

rest - 如何合并/合并来自多个RESTful微服务的响应?

java - 如何使用 JAXB Moxy 解码具有未命名字段的 JSON