Как сделать сжатие GZIP при записи непосредственно в ответ - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь сжать мой ответ, когда заголовок запроса содержит gzip в Accept-Encoding. Однако добавление следующего к app.properties работает только тогда, когда метод контроллера возвращает объект.

server.compression.enabled=true
server.compression.min-response-size=1
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css

Я пишу прямо в поток ответов. Таким образом, указанные выше свойства сжатия не работают.

Мой метод выглядит так:

@GetMapping(path = "/something", produces = MediaType.TEXT_PLAIN_VALUE)
public void getSomething(@RequestParam(name = "paramA") String paramA,
                            HttpServletRequest request,
                                  HttpServletResponse response) throws IOException {
            PrintWriter writer = null;
    if (request.getHeader("Accept-Encoding").contains("gzip")) {
        writer = new PrintWriter(new OutputStreamWriter(new GZIPOutputStream(response.getOutputStream())));
        response.addHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
    } else {
        writer = response.getWriter();
    }

    final PrintWriter fwriter = writer;
    someObjectInstance.getSomething(paramA).forEach(x -> {
        fwriter.write(x.toString());
    });
    fwriter.flush();
}

Когда я скручиваю вышеупомянутый метод, я получаю пустой файл. Я пытался использовать GzipFilter, ссылаясь на следующую ссылку. http://www.javablog.fr/javaweb-gzip-compression-protocol-http-filter-gzipresponsewrapper-gzipresponsewrapper.html,, который работает, кстати. Тем не менее, фильтр требует много шаблонного кода. Есть ли способ, которым я могу внести изменения в метод контроллера и решить проблему, как в ссылке, упомянутой выше.

1 Ответ

0 голосов
/ 04 июля 2018

Просто понял, что я не закрываю писателя. После добавления fwriter.close (); в конце концов проблема была решена.

...