`

Spring 注解学习手札(八)补遗——@ExceptionHandler

阅读更多
Spring注解,改变了我的开发思路。前段时间,用@RequestBody@ResponseBody,不费吹灰之力就解决了JSon自动绑定。接着就发现,如果遇到RuntimeException,需要给出一个默认返回JSON。

以前都是用SimpleMappingExceptionResolver拦截实现,今天偶尔看下资料,@ExceptionHandler,就把这个异常给拦截了,太方便了!

相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler



直接上代码:
@Controller
public class AccessController {

	/**
	 * 异常页面控制
	 * 
	 * @param runtimeException
	 * @return
	 */
	@ExceptionHandler(RuntimeException.class)
	public @ResponseBody
	Map<String,Object> runtimeExceptionHandler(RuntimeException runtimeException) {
		logger.error(runtimeException.getLocalizedMessage());

		Map model = new TreeMap();
		model.put("status", false);
		return model;
	}

}


当这个Controller中任何一个方法发生异常,一定会被这个方法拦截到。然后,输出日志。封装Map并返回,页面上得到status为false。就这么简单。

或者这个有些有些复杂,来个简单易懂的,上代码:
@Controller
public class AccessController {
	/**
	 * 异常页面控制
	 * 
	 * @param runtimeException
	 * @return
	 */
	@ExceptionHandler(RuntimeException.class)
	public String runtimeExceptionHandler(RuntimeException runtimeException,
			ModelMap modelMap) {
		logger.error(runtimeException.getLocalizedMessage());

		modelMap.put("status", IntegralConstant.FAIL_STATUS);
		return "exception";
	}
}


相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler

8
4
分享到:
评论
16 楼 liuyachao111 2018-04-16  
11楼说的对 用@ControllerAdvice
public class WebExceptionHandler {...
可以统一处理异常,对所有的Controller都起作用
15 楼 tomecs 2017-10-11  
学完了,感觉收获好多,
14 楼 di1984HIT 2017-06-25  
学习了~~
13 楼 cruiser_31hehe 2017-03-13  
chenyueling 写道
可以使用 @ControllerAdvice

@ControllerAdvice
public class SpringExceptionHandler{
  /**
     * 全局处理Exception
     * 错误的情况下返回500
     * @param ex
     * @param req
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity<Object> handleOtherExceptions(final Exception ex, final WebRequest req) {
        TResult tResult = new TResult();
        tResult.setStatus(CodeType.V_500);
        tResult.setErrorMessage(ex.getMessage());
        return new ResponseEntity<Object>(tResult,HttpStatus.OK);
    }

}


不用任何的配置,只要把这个类放在项目中,Spring能扫描到的地方。就可以实现全局异常的回调。


建议将
return new ResponseEntity<Object>(tResult,HttpStatus.OK);
改为
return new ResponseEntity<Object>(tResult,HttpStatus.INTERNAL_SERVER_ERROR);
12 楼 家哇尘续缘 2016-09-11  
chenyueling 写道
可以使用 @ControllerAdvice

@ControllerAdvice
public class SpringExceptionHandler{
  /**
     * 全局处理Exception
     * 错误的情况下返回500
     * @param ex
     * @param req
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity<Object> handleOtherExceptions(final Exception ex, final WebRequest req) {
        TResult tResult = new TResult();
        tResult.setStatus(CodeType.V_500);
        tResult.setErrorMessage(ex.getMessage());
        return new ResponseEntity<Object>(tResult,HttpStatus.OK);
    }

}


不用任何的配置,只要把这个类放在项目中,Spring能扫描到的地方。就可以实现全局异常的回调。


正解!!!
11 楼 chenyueling 2016-03-09  
可以使用 @ControllerAdvice

@ControllerAdvice
public class SpringExceptionHandler{
  /**
     * 全局处理Exception
     * 错误的情况下返回500
     * @param ex
     * @param req
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity<Object> handleOtherExceptions(final Exception ex, final WebRequest req) {
        TResult tResult = new TResult();
        tResult.setStatus(CodeType.V_500);
        tResult.setErrorMessage(ex.getMessage());
        return new ResponseEntity<Object>(tResult,HttpStatus.OK);
    }

}


不用任何的配置,只要把这个类放在项目中,Spring能扫描到的地方。就可以实现全局异常的回调。
10 楼 wangleihome 2016-01-13  
不错
9 楼 高国藩 2015-07-09  
设置一个全局的异常处理类就可以了啊,为什么还要这样写呢
8 楼 在世界的中心呼喚愛 2015-04-06  
yangtong501703793 写道
daisiki 写道
也有不好的地方,每个Controller你都得写一遍...


完全可以将@ExceptionHandler写到父类中,然后子类controller继承。。。

那还不如写到xml里,全局处理
7 楼 yangtong501703793 2013-10-08  
daisiki 写道
也有不好的地方,每个Controller你都得写一遍...


完全可以将@ExceptionHandler写到父类中,然后子类controller继承。。。
6 楼 snowolf 2013-01-17  
saintsaya 写道
测试了一下第一种方式可行,第二种方式不可行,参数里放一个ModelMap会抛异常,Illegal那个参数异常,放在里面new出来是可以的,各位可以测试一下

兄弟,再具体一点,给个代码参考下,我完善下
5 楼 saintsaya 2013-01-17  
测试了一下第一种方式可行,第二种方式不可行,参数里放一个ModelMap会抛异常,Illegal那个参数异常,放在里面new出来是可以的,各位可以测试一下
4 楼 iluoxuan 2012-12-25  
继承啊 真实的
3 楼 snowolf 2012-09-20  
daisiki 写道
进行异常处理的方法必须与出错的方法在同一个Controller里面

嗯,这是这种处理方式的限定
2 楼 daisiki 2012-09-20  
进行异常处理的方法必须与出错的方法在同一个Controller里面
1 楼 daisiki 2012-09-20  
也有不好的地方,每个Controller你都得写一遍...

相关推荐

Global site tag (gtag.js) - Google Analytics