向json响应添加异常消息

时间:2010-10-27 13:04:12

标签: java ajax json exception struts2

我有一个代码会抛出一个特定类型的异常,如下所示:

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 个答案:

答案 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响应。否则,您将陷入将结果映射到某种页面或结果的默认行为。

就个人而言,我更喜欢后一种方法。