Добавить сообщение об исключении в ответ JSON - PullRequest
2 голосов
/ 27 октября 2010

У меня есть код, который выдает исключение определенного типа, например:

throw new BadDataException("error message");

исключения такого рода создаются внутри метода с типом ответа json. У меня есть конфигурация для этого типа исключения, как это:

<global-exception-mappings>
     <exception-mapping result="badDataError" exception="mypackage.BadDataException" />
</global-exception-mappings>

<result name="badDataError" type="json">
    <param name="statusCode">500</param>
</result>

Я хотел бы добавить сообщение об исключении в ответ json, чтобы показать его пользователю. Есть ли способ сопоставить сообщение об исключении с ответом, когда возвращается код состояния 500. Вызов ajax будет выглядеть примерно так:

$.ajax(
{ 
   ...
    success: function(data, textStatus) {
         alert('Success'); 
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
         alert("Error");//I'd like to add here the reason (exception message)
    }
    ...
}
);

Как я могу автоматически добавить сообщение об этом исключении в ответ HTTP 500? (если это возможно)

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Вот наконец я так и сделал.Я добавил поле errorMessage к ответу HTTP 500 таким образом.

<result name="badDataError" type="httpheader">
                <param name="status">500</param>
                <param name="headers.errorMessage">${exception.message}</param>
</result>

и в запросе ajax я восстанавливаю сообщение вот так.

error: function (XMLHttpRequest, textStatus, errorThrown) {
     var errorMessage = XMLHttpRequest.getResponseHeader('errorMessage'); 
     ....
}

Может быть, есть ещеэлегантный способ сделать это, но по крайней мере это работает.

1 голос
/ 28 октября 2010

Другим вариантом является создание пользовательского типа результата, который одновременно устанавливает статус 500 ISE , а возвращает ответ JSON, содержащий данные об ошибке. Затем просто сопоставьте свое исключение с этим типом результата в вашем struts.xml (так же, как вы сопоставили его с типом httpheader в приведенном выше примере).

Еще один вариант - создать аннотацию для ваших методов действий Struts, которые вы собираетесь вызывать через AJAX. Затем создайте подкласс стандартного ExceptionMappingInterceptor и, если метод действия помечен как @AjaxRequest (или как вы его называете), вы вернете стандартный ответ JSON, содержащий информацию об исключении. В противном случае вы переходите к стандартному поведению сопоставления результата с какой-либо страницей или результатом.

Лично я предпочитаю последний подход.

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