`
lovefly_zero
  • 浏览: 387011 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

Spring Json View之错误处理和异常处理

阅读更多

错误处理

错误处理是在控制器增加一些公共或字段级别的错误(绑定结果集)到Model后触发的。 

  1. 配置
  2. HttpStatusError
  3. ModelFlagError 
  4. 自主实现JsonErrorHandler

 

1. Spring配置文件:view.xml

把错误(公共级别的和字段级别的)配置好后转换成一个json字符串,所有注册的Json错误处理会按它们被添加的顺序来触发。

 

下列是JsonErrorHadnders的实现:

 

HttpStatusError

通过response.setStatus(errorCode)设置一个新返回状态;一些Ajax框架比如prototype.js中触发成功状态使用返回状态编码是200299,失败状态使用>=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. 配置
  2. JsonErrorHandler
  3. 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 ...

}

分享到:
评论

相关推荐

    spring-mvc-error-handling-example:Spring MVC错误处理示例

    Spring Boot & Spring MVC 异常处理的N种方法 参考文档: Spring Boot 1.5.4.RELEASE Spring framework 4.3.9.RELEASE 默认行为 根据Spring Boot官方文档的说法: For machine clients it will produce a JSON ...

    《Spring Boot 2精髓:从构建小系统到架构分布式大系统》学习项目源码

    URL 映射、文件上传、JSON 解析、JSR303 验证框架、跨域访问、通用错误处理 2018-2018031401:04-ch04-view 第四章《视图技术》学习源码 Beetl 模版引擎、JSON 技术 2018-2018062501:05-ch05-data 第五章...

    spring mvc 3.2 参考文档

    view-controller (MVC)框架是围绕 DispatcherServlet 设计的,并分发请求到处理程序(handler),Spring MVC支持可配置的处理程序映射(handler mapping),视图解析(view resolution)、 区域设置(locale)和主题解析...

    Spring Boot中文文档.rar

    错误处理 自定义错误页面 28.2.6.网络过滤器 28.3.JAX-RS和Jersey 28.4.嵌入式Servlet容器支持 28.4.1.Servlet,过滤器和监听器 注册Servlet,过滤器和监听器Spring Beans 28.4.2.Servlet...

    员工管理:员工管理

    使用JsonView过滤视图 使用ModelMapper和MapStruct的DTO 带有Spring Boot Admin,Micrometer和AppOptics的执行器 快来了….. 单元和集成测试 与Circle CI持续集成 使用Code COV进行代码覆盖 使用thymeleaf /以及...

    SpringMVC Employee Demo

    driven配置、InitBinder注解、数据的格式化、JSR303数据校验、错误消息的显示及国际化、Ajax返回JSON、使用HttpMessageConverter、国际化_通过超链接切换中英文、文件上传、自定义的拦截器、拦截器的零Xml配置、异常...

    java开源包1

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包11

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包2

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包3

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包6

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包5

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包10

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包4

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包8

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包7

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包9

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包101

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    Java资源包01

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

Global site tag (gtag.js) - Google Analytics