Когда Struts отправляет 500 Internal Server Error, возникают исключения - PullRequest
8 голосов
/ 13 марта 2012

Я работаю над внешним интерфейсом JavaScript с поддержкой AJAX, который выполняет вызовы к внутреннему интерфейсу Java, написанному на Struts. Моя проблема в том, что, когда сервер выдает исключение, клиент по-прежнему видит код ответа HTTP «200 OK» вместо «500 Internal Server Error», как и следовало ожидать.

Это приводит меня в замешательство, потому что моя сторонняя клиентская библиотека JavaScript зависит от кодов состояния HTTP, чтобы определить, что-то не так с вызовом AJAX, как это обычно делают большинство современных библиотек. Ошибки проходят незамеченными, пока мой код не взорвется, когда он попытается проанализировать то, что обычно будет JSON.

Я действительно хочу избежать взлома моей клиентской библиотеки JS, чтобы корректно обрабатывать эти ошибки. Итак, как я могу заставить Struts дать мне код состояния 500, когда в бэкэнде было необработанное исключение? Разве это не должно быть поведением Struts по умолчанию?

Редактировать: Код на стороне клиента в данном случае не имеет значения. Мне нужно исправить сервер, чтобы он отправлял соответствующий код состояния при возникновении необработанных исключений. Спасибо!

Ответы [ 4 ]

3 голосов
/ 26 марта 2013

Обновление : я исправил раздел <global-results> (в котором отсутствовал тег httpheader)

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

  1. В struts.xml создайте глобальное сопоставление исключений из "java.lang.Exception" врезультат с именем «исключение»
  2. В Struts.xml создайте глобальный результат, который сопоставляет «исключение» с результатом httpheader со значением 500.
  3. В web.xml , создайте запись страницы ошибок, которая сопоставляет код ошибки 500 с местоположением вашей страницы ошибок.

Итак, для struts.xml:

<global-exception-mappings>
    <exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>

<global-results>
    <result name="exception" type="httpheader">
        <param name="error">500</param>
    </result>
</global-results>

И для web.xml

<error-page>
    <error-code>500</error-code>
    <location>/exception.jsp</location>
</error-page>

Это работает, но имеет некоторые большие недостатки.Контейнер сервлетов отображает вашу страницу с ошибкой (не Struts), поэтому у вас не будет доступа к исходному сообщению об ошибке или к параметру Stats ValueStack.Однако ведение журнала исключений все равно будет работать (если вы его включили).

Кроме того, я также нахожу сбивающим с толку тот факт, что распорки затрудняют это.В любой другой среде я имел дело с концепцией возврата страницы ошибок и , код ошибки довольно прост для реализации.

3 голосов
/ 15 марта 2012

Я нашел один способ сделать это.Я не уверен, что это лучше или проще, но это работает.Я нашел руководство по настройке исключений Struts и добавил следующее к своему <package> внутри struts.xml:

<global-results>
  <result name="exception">/exception.jsp</result>
</global-results>

<global-exception-mappings>
  <exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>

Это приводит к перенаправлению всех необработанных исключений на /exception.jsp.А вот содержимое JSP:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="application/json; charset=UTF-8" %>
<% response.setStatus(500); %>
{"success": false,"errors": "<s:property value="%{exception.message}"/>"}

В 3-й строке вы заметите, что я вручную установил код ответа 500.

Это дало мне новую проблему: исключений не былобыть зарегистрированным больше.Как указывалось в вышеупомянутом руководстве по Struts, я решил эту проблему, добавив следующее в мои <package> in struts.xml:

<interceptors>
    <interceptor-stack name="appDefaultStack">
        <interceptor-ref name="defaultStack">
            <param name="exception.logEnabled">true</param>
             <param name="exception.logLevel">ERROR</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="appDefaultStack" />

Struts: -1 для создания такой простой и очевидной функции, НЕпо умолчанию, и еще -1 для того, чтобы сделать решение таким тупым.

0 голосов
/ 18 декабря 2012

Внутренняя ошибка сервера 500 - это ошибка на стороне сервера. Это означает, что проблема, вероятно, связана не с вашим компьютером или подключением к Интернету, а с сервером веб-сайта.

Не обращать вниманияэто на стороне клиента.Он находится на веб-сервере (HTTP-сервере), настроенном для обработки запросов.

0 голосов
/ 14 марта 2012

Вы не упомянули, какую библиотеку JS вы используете. Я бы предложил внимательно прочитать документацию. Если у него есть какой-то метод обратного вызова, он должен иметь responseText, отличный от responseCode. Всякий раз, когда происходит какое-либо исключение проверки на стороне сервера, также передайте сообщение об ошибке. Только не полагайтесь на некоторые исключения, потому что вы используете AJAX. Вы можете отследить это responseText для отображения некоторого сообщения типа «проверка не удалась по этой причине, пожалуйста, попробуйте еще раз». Согласны?

В противном случае выведите WebApplicationException до того, как ответ будет принят:

throw new javax.ws.rs.WebApplicationException();  // or by any other constructor

Вот банка

...