精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-11
最后修改:2009-05-25
错误处理 错误处理是在控制器增加一些公共或字段级别的错误(绑定结果集)到Model后触发的。
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操作的期间捕获并抛出异常。
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 ... } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3328 次