У меня есть контроллер, подобный этому:
@GetMapping(value = "/some_url")
public void foo(HttpServletResponse response) throws IOException {
response.addHeader(CONTENT_DISPOSITION, "attachment;filename=" + BAR);
response.setContentType(TXT_PLAIN + "; charset=" + UTF_8);
someService.doSomeWork(response.getWriter());
}
doSomeWork:
try (CSVWriter csvWriter = new CSVWriter(writer, SEPARATOR, QUOTECHAR, ESCAPECHAR, LINE_END)) {
if(someCondition()){
throw new RuntimeException();
}
csvWriter.writeAll(csvLines);
} catch (IOException e) {
LOGGER.warn("Can't write csv", e);
throw new IllegalStateException(e);
}
Для случая, когда someCondition()
возвращает true, поэтому RuntimeException
выдает файл браузера из файла загрузки и я вижу ошибкутекст внутри.
Я пытался изменить порядок строк в контроллере следующим образом:
someService.doSomeWork(response.getWriter());
response.addHeader(CONTENT_DISPOSITION, "attachment;filename=" + BAR);
response.setContentType(TXT_PLAIN + "; charset=" + UTF_8);
Но похоже, что я не могу установить заголовки после закрытия средства записи ответов.
Ожидаемое поведение:
1. Для случая без ошибок - браузер загружает файл
2. Для случая с ошибкой - браузер не загружает файл, и я вижу ошибку в теле ответа.
Не могли бы вы помочь достичь этого?