`

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你都得写一遍...

相关推荐

    Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    在Spring框架中,注解是实现轻量级、声明式编程的重要工具,极大地简化了代码并提高了可维护性。本文将深入探讨`@ResponseBody`、`@RequestBody`和`@PathVariable`这三个关键注解,它们在处理HTTP请求和响应中的作用...

    Spring 注解学习手札(一) 构建简单Web应用

    Spring提供`@ExceptionHandler`注解,可以定义在控制器类或方法上,用于捕获和处理特定类型的异常。这有助于保持代码的整洁,同时提供统一的错误处理机制。 为了启动Spring应用,通常我们会创建一个`@Configuration...

    Spring 注解学习手札(二) 控制层梳理

    这篇“Spring注解学习手札(二)控制层梳理”主要聚焦于如何利用注解来构建和理解Spring MVC的控制层,即Controller。Spring MVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。 一、@RestController...

    Spring 注解学习手札

    【Spring注解学习手札】 在现代Java Web开发中,Spring框架因其强大的功能和灵活性而备受推崇。Spring注解的引入极大地简化了配置文件,提高了开发效率。本篇将聚焦于Spring MVC中的注解,通过构建一个简单的Web...

    Spring 注解学习手札(四) 持久层浅析

    在本篇《Spring注解学习手札(四)持久层浅析》中,我们将深入探讨Spring框架在持久层的应用,特别是如何通过注解简化数据库操作。Spring作为一个强大的轻量级框架,提供了丰富的功能来处理数据访问,使得开发者可以...

    Spring 注解学习手札(三) 表单页面处理

    在本篇《Spring注解学习手札(三)表单页面处理》中,我们将深入探讨Spring框架中关于处理Web表单的关键注解和技术。在实际的Web开发中,表单处理是用户交互的重要组成部分,Spring提供了强大的支持,使得开发者能够...

    Spring 注解学习手札(六) 测试

    在本篇《Spring注解学习手札(六)——测试》中,我们将深入探讨Spring框架中的测试支持,尤其是如何利用注解进行单元测试和集成测试。Spring为开发者提供了丰富的注解,使得测试代码更加简洁、易读且易于维护。本文...

    Spring 注解学习手札(五) 业务层事务处理

    这篇“Spring注解学习手札(五)——业务层事务处理”深入探讨了如何使用注解来管理应用程序中的事务,确保数据的一致性和完整性。Spring提供了声明式事务管理,使得开发者无需编写繁琐的事务控制代码,只需在方法上...

    Perl_学习手札

    这份"Perl学习手札"是为那些想要深入理解Perl语言特性和应用的初学者或有一定经验的开发者准备的宝贵资源。 首先,Perl的核心特性在于其灵活性和表达力。Perl语法受到了C、sed、awk等多种语言的影响,这使得它在...

    spring 的详细使用

    - "spring-reference.pdf" 和 "Spring注解手札.pdf" 可能是详细的 Spring 参考文档和注解指南,对于深入学习 Spring 极为有用。 以上内容只是 Spring 框架的冰山一角,想要精通 Spring,还需要通过阅读文档、实践...

    perl学习手札中文

    "Perl学习手札中文"是一份专为初学者设计的学习资料,旨在帮助读者快速掌握Perl语言的基础和高级特性。以下是对这些文件内容的概览: 1. **word.css**: 这个文件可能是样式表,用于定义文档中的排版和格式。在学习...

    perl学习手札(简体中文)_简信昌

    关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”

    Perl学习手札.chm

    Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm

    hibernate学习手札.z03

    hibernate学习手札.z03

    hibernate学习手札.z01

    hibernate学习手札.z01

    高级Perl编程(黑豹书)+学习手札

    "高级Perl编程(黑豹书)"和"Perl_学习手札"这两本书籍是深入理解并掌握Perl编程的重要资源。 《高级Perl编程》(黑豹书)是Perl编程领域的经典之作,它不仅适合初学者作为进阶读物,也对有经验的Perl程序员提供了...

    Perl 学习手札

    通过深入学习“Perl学习手札”,你可以系统地掌握这些概念,并逐步成长为一个熟练的Perl程序员。记住,实践是检验知识的最好方式,所以不仅要理解理论,还要动手编写代码,解决实际问题。祝你在Perl的学习之旅中取得...

Global site tag (gtag.js) - Google Analytics