Jersey 如何在JAX-RS端点/payara微响应中实施gzip压缩

Jersey 如何在JAX-RS端点/payara微响应中实施gzip压缩,jersey,compression,gzip,payara-micro,Jersey,Compression,Gzip,Payara Micro,我在JAX-RS端点中以JSON响应的形式发送大量数据 有没有办法在javax.ws.rs中将“始终压缩”参数设置为端点注释,或者在payara micro级别将其设置为参数,以始终压缩响应 当前状态是端点支持提供数据的未压缩和压缩(例如curl--compressed)方式 @GET @路径(“/大响应”) @产生(MediaType.APPLICATION_JSON) @ApiOperation(value=“提供有关某些企业的Json信息”) @ApiResponses(值={ @ApiR

我在JAX-RS端点中以JSON响应的形式发送大量数据

有没有办法在javax.ws.rs中将“始终压缩”参数设置为端点注释,或者在payara micro级别将其设置为参数,以始终压缩响应

当前状态是端点支持提供数据的未压缩压缩(例如curl--compressed)方式

@GET
@路径(“/大响应”)
@产生(MediaType.APPLICATION_JSON)
@ApiOperation(value=“提供有关某些企业的Json信息”)
@ApiResponses(值={
@ApiResponse(代码=200,message=“传输成功”),
@ApiResponse(代码=400,message=“错误请求”),
@ApiResponse(代码=500,message=“内部服务器错误”)}
公共void retrieveTheData(){
我希望端点总是用压缩数据(内容编码:gzip)响应

拦截器

import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.Deflater;
import java.util.zip.GZIPOutputStream;

import javax.enterprise.context.Dependent;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;

import hr.abc.leonus.api.gateway.util.Compress;

@Provider
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {

    public static final String CONTENT_ENCODING = "Content-Encoding";
    public static final String GZIP = "gzip";

    @Override
    public void aroundWriteTo(WriterInterceptorContext context)
            throws IOException, WebApplicationException {

        MultivaluedMap<String, Object> headers = context.getHeaders();
        headers.add(CONTENT_ENCODING, GZIP);

        final OutputStream outputStream = context.getOutputStream();

        GatewayGZIPOutputStream gzipStream = new GatewayGZIPOutputStream(outputStream);
        gzipStream.setLevel(Deflater.BEST_SPEED);
        context.setOutputStream(gzipStream);
        context.proceed();
    }
}

class GatewayGZIPOutputStreamextends GZIPOutputStream {

    public GatewayGZIPOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    public void setLevel(int level) {
        def.setLevel(level);
    }
}
您可以通过设置压缩级别来调整GatewayGZIPOutputStreamobject中的压缩级别。我使用最小值来获得最佳速度。
@压缩注释可用于类内每个方法的方法或资源类。

如果压缩可以作为注释单独应用于每个JAX-RS端点,则会更好。感谢您的任何建议。该页面上存在类似问题:但不确定是否强制压缩。存在以下问题:因此,在这里实现WriterInterceptor的一种方法是:使用@Compress注释->这可能是一种可行的解决方案
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.Deflater;
import java.util.zip.GZIPOutputStream;

import javax.enterprise.context.Dependent;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;

import hr.abc.leonus.api.gateway.util.Compress;

@Provider
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {

    public static final String CONTENT_ENCODING = "Content-Encoding";
    public static final String GZIP = "gzip";

    @Override
    public void aroundWriteTo(WriterInterceptorContext context)
            throws IOException, WebApplicationException {

        MultivaluedMap<String, Object> headers = context.getHeaders();
        headers.add(CONTENT_ENCODING, GZIP);

        final OutputStream outputStream = context.getOutputStream();

        GatewayGZIPOutputStream gzipStream = new GatewayGZIPOutputStream(outputStream);
        gzipStream.setLevel(Deflater.BEST_SPEED);
        context.setOutputStream(gzipStream);
        context.proceed();
    }
}

class GatewayGZIPOutputStreamextends GZIPOutputStream {

    public GatewayGZIPOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    public void setLevel(int level) {
        def.setLevel(level);
    }
}
@Compress
@GET
@Path("/big-response")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Provides Json information about some etities")
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Transfer successful"),
        @ApiResponse(code = 400, message = "Bad request"),
        @ApiResponse(code = 500, message = "Internal server error")})
public void retrieveTheData() {
}