2010-10-27 31 views
2

我有抛出一个特定类型的异常像这样的代码:添加异常消息,以JSON响应

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(
{ 
    ... 
    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

只是为了澄清,你的问题是如何发送错误消息以及HTTP 500响应?或者如何在客户端接收它?或两者? – 2010-10-27 13:13:49

+0

@ T.J。 Crowder我的问题是关于如何从异常中获取消息并使用此配置将其添加到HTTP 500响应中。 – Javi 2010-10-27 15:08:47

回答

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

另一种选择是创建一个定制结果类型,它既设置500 ISE状态返回包含错误数据的JSON响应。然后将你的异常映射到struts.xml中的结果类型(就像你在上面的例子中将它映射到httpheader类型一样)。

另一种选择是为您打算通过AJAX调用的Struts操作方法创建注释。然后,标准ExceptionMappingInterceptor的子类,如果操作方法注释为@AjaxRequest(或任何您称之为),则返回包含异常信息的标准JSON响应。否则,您将转向将结果映射到某种页面或结果的默认行为。

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