Отправка ответа об ошибке после того, как ответ сервлета был записан - PullRequest
0 голосов
/ 23 января 2012

Я пишу приложение для передачи данных с использованием сервлета и хотел бы иметь возможность отправить ответ об ошибке, если проблема возникает после того, как ответ сервлета был записан. Это возможно?

Моя проблема заключается в том, что я буду отправлять большие сжатые файлы CSV, созданные на основе данных, считанных из базы данных. Все сделано с потоками, поэтому возможно, что при создании файла csv после записи ответа сервлета может произойти ошибка. Я видел, как это произошло.

Я заметил, что это проблема только после сброса сервлета OutputStream. Если он не был сброшен, я могу отправить ответ об ошибке, но не после. Поскольку я имею дело с большими объемами данных, невозможно отправить все за один раз.

1 Ответ

1 голос
/ 23 января 2012

Я пишу приложение для передачи данных с использованием сервлета и хотел бы иметь возможность отправить ответ об ошибке, если возникла проблема после того, как ответ сервлета был записан.Это возможно?

Не со стороны сервера.Сервер не может вернуть уже сброшенные байты от клиента.Это точка невозврата.Я предполагаю, что это касается другого исключения, чем IOException в ответе Writer или OutputStream.

Если бы это был HTML (даже если это плохая практика; HTML принадлежит JSP), вы может напечатать некоторый код JS, который вызывает изменение местоположения следующим образом:

try {
    writer.write(someHtml);
} catch (SomeException e) {
    writer.write("<script>window.location = 'error.jsp';</script>");
    // ...
}

Но это невозможно в ответах, отличных от HTML.Вам действительно нужно заранее буферизовать весь ответ в памяти или на (временном) диске.Если буферизация прошла безупречно, вы можете снова направить ее к ответу.

try {
    processAndSaveInMemoryOrTempDiskFile(someData, byteArrayOrFileLocation);
} catch (SomeException e) {
    throw new ServletException(e, "Processing some data failed.");
}

copyFromMemoryOrTempDiskToResponse(byteArrayOrFileLocation, writer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...