Сервлет и условия ошибки - PullRequest
1 голос
/ 16 июля 2010

Я пишу свой первый сервлет JAVA, и у меня есть вопрос.

Может быть, важно сказать, что мой сервлет будет вызываться из Google Web Toolkit (AJAX)

Первое, что я делаю, это создаю PrintWriter и начинаю писать в нем мой вывод JSON

PrintWriter out = response.getWriter();
...
out.println("[");
out.println("  {");
out.println("    \"validation\" : {");
...

но что произойдет, если я получу условие ошибки?

Как правильно вернуть ошибку клиенту?(AJAX-клиент)

Должен ли я буферизовать свой вывод (КАК?) И вернуть ошибку как JSON (вместо вывода), или я должен вызвать ServletException?

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Как говорит @McDowell, правильный способ справиться с ошибкой во время обработки запроса в сервлете - установить код состояния HTTP в объекте ответа.

Но тут есть одна загвоздка.

Код состояния HTTP фактически передается в первой строке ответа HTTP. И это записывается, когда ответ «зафиксирован», что обычно происходит, когда вы звоните response.getOutputStream() или response.getWriter(). После этого вы не можете изменить код состояния.

Чтобы справиться с этим, нужно выполнить одно из следующих действий:

  • Кодируйте ваше приложение, чтобы не возникало ошибок при генерации тела ответа.
  • Создайте тело ответа в каком-либо буфере и открывайте выходной поток / считыватель ответов только после того, как вы его полностью построите. Если во время генерации тела возникают ошибки, вы можете установить код состояния HTTP и (при необходимости) отправить альтернативное тело, содержащее сообщение об ошибке.
2 голосов
/ 16 июля 2010

Просто создайте строку в памяти, используя, например, StringBuilder.Не пишите никаких символов в ответ, пока не закончите сборку строки.Это «буферизация».

StringBuilder builder= new StringBuilder();
builder.append("[");
builder.append("  {");
builder.append("    \"validation\" : {");
// ...

// When finished:
response.getWriter().write(builder.toString());

Когда что-то происходит в это время, либо выведите ServletException (что приведет к странице ошибки сервера по умолчанию с кодом состояния 500), либо используйте HttpServletResponse#sendError() чтобы отправить более конкретный статус ошибки.Но обычно код состояния 500 является достаточным признаком для XMLHttpRequest клиента, чтобы что-то не получилось на стороне сервера.

try {
    // Build and write JSON.
} catch (Exception e) {
    throw new ServletException(e);
}  
1 голос
/ 16 июля 2010

См. коды состояния HTTP .Вы можете использовать HttpServletResponse.setStatus для установки состояния ответа (обратите внимание также на константы, определенные этим классом).

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