错误处理
错误处理是在控制器增加一些公共或字段级别的错误(绑定结果集)到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"><value>999</value></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"><value>failure</value></property>
<property name="value"><value>true</value></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"><value>jsonView</value></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.thing.spring.json.controller.[...]
\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"><value>jsonView</value></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"><value>myKey</value></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"><value>jsonView</value></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"><value>true</value></property>
<property name="modelKey"><value>myKey</value></property>
</bean>
</beans>
?
效果:
=======
Response-Status : 200
{
"myKey": "java.lang.Exception: You throw an exeption !
<\br>\tat org.thing.spring.json.controller.[...]
<\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 ...
}
}?