2010-10-27 36 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響應。否則,您將轉向將結果映射到某種頁面或結果的默認行爲。

就我個人而言,我更喜歡後一種方法。