我有一个代码会抛出一个特定类型的异常,如下所示:
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响应中? (如果可能的话)
由于
答案 0 :(得分:3)
这终于是我如何做到的。我已经以这种方式向HTTP 500响应中添加了一个errorMessage字段。
<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 :(得分:1)
另一种选择是创建一个自定义结果类型,它既设置500 ISE状态又返回包含错误数据的JSON响应。然后只需将您的异常映射到struts.xml中的结果类型(就像您在上面的示例中将其映射到httpheader类型一样)。
另一个选择是为您打算通过AJAX调用的Struts操作方法创建一个注释。然后,继承标准的ExceptionMappingInterceptor,如果action方法注释为@AjaxRequest
(或者你称之为),那么你将返回一个包含异常信息的标准JSON响应。否则,您将陷入将结果映射到某种页面或结果的默认行为。
就个人而言,我更喜欢后一种方法。