gpt4 book ai didi

jersey - 在 Jersey JAX-RS 服务器中返回大对象时如何设置 Content-Length

转载 作者:行者123 更新时间:2023-12-04 23:50:07 25 4
gpt4 key购买 nike

我有时想返回一个大(几 MB)二进制对象作为来自 JAX-RS 资源方法的响应。我知道对象的大小,并且我希望在响应中设置 Content-Length header ,并且我不希望使用分块传输编码。

在 Jersey 1.x 中,我使用自定义 MessageBodyWriter 解决了这个问题:

public class Blob {
public InputStream stream;
public long length;
}

@Provider
public class BlobWriter extends MessageBodyWriter<Blob> {

public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return Blob.class.isAssignableFrom(type);
}

public long getSize(T t, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return t.length;
}

public void writeTo(T t, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream)
throws java.io.IOException {
org.glassfish.jersey.message.internal.ReaderWriter.writeTo(t.stream, entityStream);
}
}

但是当我升级到 Jersey 2.x 时,这停止工作,因为 JAX-RS/Jersey 2 不再关心 MessageBodyWriter.getSize()。我怎样才能用 Jersey 2 做到这一点?

最佳答案

似乎可以使用提供的 httpHeaders 从 MessageBodyWriter.writeTo() 设置 Content-Length header :

  public void writeTo(T t, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream)
throws java.io.IOException {
httpHeaders.addFirst(HttpHeaders.CONTENT_LENGTH, t.length.toString);
org.glassfish.jersey.message.internal.ReaderWriter.writeTo(t.stream, entityStream);
}

关于jersey - 在 Jersey JAX-RS 服务器中返回大对象时如何设置 Content-Length,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24572771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com