Я пытаюсь сжать мой ответ, когда заголовок запроса содержит 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,, который работает, кстати.
Тем не менее, фильтр требует много шаблонного кода. Есть ли способ, которым я могу внести изменения в метод контроллера и решить проблему, как в ссылке, упомянутой выше.