我有时想返回一个大的(几个 MB)二进制对象作为 JAX-RS 资源方法的响应。我知道对象的大小,并且希望在响应上设置 Content-Length 标头,并且不希望使用分块传输编码。
在 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 实现这一目标?