Spring Json View之異常處理和錯誤處理
錯誤處理
錯誤處理是在控制器增加一些公共或欄位級別的錯誤(繫結結果集)到Model後觸發的。
-
配置
-
HttpStatusError
-
ModelFlagError
-
自主實現JsonErrorHandler
1. Spring配置檔案:view.xml
把錯誤(公共級別的和欄位級別的)配置好後轉換成一個json字串,所有註冊的Json錯誤處理會按它們被新增的順序來觸發。
下列是JsonErrorHadnders的實現:
HttpStatusError
通過response.setStatus(errorCode)設定一個新返回狀態;一些Ajax框架比如prototype.js中觸發成功狀態使用返回狀態編碼是200-299,失敗狀態使用>=300,
預設編程式碼為311。
ModelFlagError
在Model裡增加一個簡單鍵值對。一些Web2.0 表現層框架需要一個標記來判斷伺服器端的操作是否成功或失敗。比如Ext框架需要一個failure=true 或者success=true。
預設標記是failure=true。
<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
<property name="jsonErrors">
<list>
<ref bean="statusError" />
<ref bean="modelflagError" />
</list>
</property>
</bean>
<bean name="statusError"
class="org.springframework.web.servlet.view.json.error.HttpStatusError"/>
<bean name="modelflagError"
class="org.springframework.web.servlet.view.json.error.ModelFlagError"/>
</beans>
效果:
=======
Response-Status : 311
{"command":{
"birthday":"30-01-2008",
"placeofbirth":"Sydney"
},
"failure":"true",
"hasGlobalErrors":"true",
"globalerrors": ["errormessage1","errormessage2"],
"hasFieldErrors":"true",
"fielderrors":{
"birthday":"Please enter a valide date!"
}}
2. HttpStatusError
你可以通過在HttpStatusError Bean的errorCode屬性裡自定義一個狀態錯誤編碼增加到響應資訊裡。
<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
<property name="jsonErrors">
<list>
<ref bean="statusError" />
</list>
</property>
</bean>
<bean name="statusError"
class="org.springframework.web.servlet.view.json.error.HttpStatusError">
<property name="errorCode"$amp;>amp;$lt;value>999</value$amp;>amp;$lt;/property>
</bean>
</beans>
效果:
=======
Response-Status : 999
{"command":{
"birthday":"30-01-2008",
"placeofbirth":"Sydney"
},
"hasGlobalErrors":"true",
"globalerrors": ["errormessage1","errormessage2"],
"hasFieldErrors":"true",
"fielderrors":{
"birthday":"Please enter a valide date!"
}}
3. ModelFlagError
你可以通過在ModelFlagError Bean以設定鍵和值屬性的方式把它們以鍵值對的形式新增到Model裡。
<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
<property name="jsonErrors">
<list>
<ref bean="statusError" />
<ref bean="modelflagError" />
</list>
</property>
</bean>
<bean name="modelflagError"
class="org.springframework.web.servlet.view.json.error.ModelFlagError">
<property name="name"$amp;>amp;$lt;value>failure</value$amp;>amp;$lt;/property>
<property name="value"$amp;>amp;$lt;value>true</value$amp;>amp;$lt;/property>
</bean>
</beans>
效果:
=======
Response-Status : 200
{"command":{
"birthday":"30-01-2008",
"placeofbirth":"Sydney"
},
"failure":"true",
"hasGlobalErrors":"true",
"globalerrors": ["errormessage1","errormessage2"],
"hasFieldErrors":"true",
"fielderrors":{
"birthday":"Please enter a valide date!"
}}
4. 自主實現JsonErrorHandler
最後,您也可以通過實現JsonErrorHandler來建立自己的錯誤處理。
public class MyErrorHandler implements JsonErrorHandler {
public void triggerError(Map model, RequestContext rc, BindingResult br,
HttpServletRequest request, HttpServletResponse response)
throws Exception{
// Do something ...
}
}
異常處理
Spring Json-View 提供HandlerExceptionResolver (JsonExceptionResolver)在Controller操作的期間捕獲並丟擲異常。
-
配置
-
JsonErrorHandler
-
JsonExceptionHandler
1.ExceptionMessageExceptionHandler(異常訊息異常處理器)
2.StackTraceExceptionHandler (堆疊異常處理器)
3.自定義實現JsonExceptionHandler
1. 配置:Spring ApplicationContext
你幾乎只需要註冊一個JsonErrorHandlers 或者 JsonExceptionHandler 就可以來操作函式中的響應以便丟擲異常。
注意:
把JsonExceptionResolver 註冊在ApplicationContext.xml,
而不是view.xml !!!,不然會找不到它。
JsonErrorHandlers
JsonErrorHandlers 發響應到客戶端因為有些產生了錯誤。詳細資訊參見上面錯誤處理部分。
HttpStatusError
用response.setStatus(錯誤編碼)設定一個響應狀態。
ModelFlagError
在Model中新增一個簡單鍵值對。
JsonExceptionHandler
JsonExceptionHandler負責把Java異常物件轉換成一個Json字串。
ExceptionMessageExceptionHandler
新增一個Java異常到Model裡。預設的ModelKey是"exception.message ". ExceptionMessageExceptionHandler 通過"Exception Classname : Exception Message "格式設定錯誤資訊。
比如 : "java.lang.IllegalArgumentException : Please set Parameter "
StackTraceExceptionHandler
把完整的堆疊異常新增到Model.預設的ModelKey是"exception.stacktrace".當replaceLineBreakes=true時表示可用Html</br>標記代替"\n"。
預設replaceLineBreakes=false。
<beans>
<bean id="exceptionResolver"
class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">
<property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>
<property name="errorHandler">
<list>
<ref bean="statusError" />
<ref bean="modelFlagError" />
</list>
</property>
<property name="exceptionHandler">
<list>
<ref bean="exceptionMessageExceptionHandler" />
<ref bean="stackTraceExceptionHandler" />
</list>
</property>
</bean>
<bean name="exceptionMessageExceptionHandler"
class="org.springframework.web.servlet.view.json.exception.ExceptionMessageExceptionHandler" />
<bean name="stackTraceExceptionHandler"
class="org.springframework.web.servlet.view.json.exception.StackTraceExceptionHandler" />
<bean name="statusError"
class="org.springframework.web.servlet.view.json.error.HttpStatusError"/>
<bean name="modelFlagError"
class="org.springframework.web.servlet.view.json.error.ModelFlagError"/>
</beans>
效果:
=======
Response-Status : 311
{
"failure":"true",
"exception.message":"java.lang.Exception: You throw an exeption !",
"exception.stacktrace": "java.lang.Exception: You throw an exeption !
\n\tat org.thinntroller.[...]
\n\tat org.springframework.web.servlet.mvc.[...]
[...]"
}
2. ExceptionMessageExceptionHandler
你也可以自己訂製Model-key方式的異常資訊。預設是exception.message
<beans>
<bean id="exceptionResolver"
class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">
<property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>
<property name="exceptionHandler">
<list>
<ref bean="exceptionMessageExceptionHandler" />
</list>
</property>
</bean>
<bean name="exceptionMessageExceptionHandler"
class="org.springframework.web.servlet.view.json.exception.ExceptionMessageExceptionHandler">
<property name="modelKey"$amp;>amp;$lt;value>myKey</value$amp;>amp;$lt;/property>
</bean>
</beans>
效果:
=======
Response-Status : 200
{
"myKey":"java.lang.Exception: You throw an exeption !"
}
3. StackTraceExceptionHandler
你能訂製Model-Key的堆疊跟蹤異常(預設是exception.stacktrace);你也能用Html檢視模式展現它,replaceLineBreakes=true可用Html</br>標記代替"\n",預設 replaceLineBreakes=false
<beans>
<bean id="exceptionResolver"
class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">
<property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>
<property name="exceptionHandler">
<list>
<ref bean="stackTraceExceptionHandler" />
</list>
</property>
</bean>
<bean name="stackTraceExceptionHandler"
class="org.springframework.web.servlet.view.json.exception.StackTraceExceptionHandler">
<property name="replaceLineBreakes"$amp;>amp;$lt;value>true</value$amp;>amp;$lt;/property>
<property name="modelKey"$amp;>amp;$lt;value>myKey</value$amp;>amp;$lt;/property>
</bean>
</beans>
效果:
=======
Response-Status : 200
{
"myKey": "java.lang.Exception: You throw an exeption !
<\br>\tat org.thinntroller.[...]
<\br>\tat org.springframework.web.servlet.mvc.[...]
[...]"
}
4. Custom implementation of JsonExceptionHandler
你也通過實現JsonExceptionHandler介面,並可用一些完全不同的方式來重構它。
public class MyExceptionHandler implements JsonExceptionHandler {
public void triggerException(Exception exception, Map model,
HttpServletRequest request, HttpServletResponse response)
throws Exception{
// Do something ...
}
}