在使用Springmvc框架处理controller的中,难免会出现逻辑错误,导致代码抛出异常的现象,习惯性都使用try/catch来捕获异常。但是当controller多了,方法也多了的时候,每个方法的异常捕获其实都一样,如果每个方法都复制粘贴同样的代码,会显得代码冗余,所以在Spring3.2以后,添加了@ControllerAdvice注解,用于全局处理异常,从而使代码简洁。
全局异常处理类
//异常处理类
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
//如果需要返回值的是view,则方法的返回值是ModelAndView
//如果需要返回值是String或者Json数据,则需要在方法上添加@ResponseBody
@ExceptionHandler(value=RuntimeException.class)
@ResponseBody
public String defaultExceptionHandler(HttpServletRequest request){
return "对不起,服务器正忙,请稍后再试";
}
}
使用ExceptionHandler注解的异常处理方法可以使用很灵活的方法签名。
可以使用以下类型的参数,参数可以以任意书序传递:
(1) 一个异常参数。声明一个一般性的异常或者更加具体的异常
(2) Request 和/或 response 对象(Servlet API 或 Portlet API)。可以选择一个特定 request/response的类型,比如ServletRequest / HttpServletRequest 或 PortletRequest / ActionRequest / RenderRequest
(3) Session 对象 (Servlet API 或Portlet API)。可以是 HttpSession ,也可以是PortletSession。这种类型的参数强制要求存在一个会话。因此,这个参数不能为
null。请注意,会话访问可能是非线程安全的,特别是在一个Servlet环境中。如果多个请求可以访问一个会话,请考虑将synchronizeOnSession标志修改为
"true"
(4) WebRequest 或 NativeWebRequest
(5) Locale
(6) InputStream / Reader 访问请求内容
(7) OutputStream / Writer 生成响应内容
(8) Model
---------------------------------------------------------------------
异常处理方法支持的返回值类型:
(1) ModelAndView 对象 (Servlet MVC or Portlet MVC)
(2) Model 对象, 通过RequestToViewNameTranslator 隐式确定的一个视图名称
(3) Map 对象, 通过RequestToViewNameTranslator 隐式确定的一个视图名称
(4) View 对象
(5) 被解析成一个视图名称的String 值
(6) @ResponseBody 注解的方法 (仅限Servlet) 设置响应内容
(7) HttpEntity<?> 或 ResponseEntity<?> (仅限Servlet) 设置响应头和响应内容
(8)
void方法自己处理了响应(通过直接写响应内容,需要声明一个属于ServletResponse / HttpServletResponse / RenderResponse 类型的参数)或者通过RequestToViewNameTranslator 隐式确定的一个视图名称(没有在方法签名中声明任何响应参数,仅适用于Servlet环境)
====================打个广告,欢迎关注====================
QQ: | 412425870 |
csdn博客: | http://blog.csdn.net/caychen |
码云: | https://gitee.com/caychen/ |
github: | https://github.com/caychen |
点击群号或者扫描二维码即可加入QQ群: | |