使用@ControllerAdvice处理异常 谁借莪1个温暖的怀抱¢ 2022-01-23 08:27 205阅读 0赞 在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中。 接下来我将通过代码展示如何使用这些注解,以及处理异常。 ## 1.注解的介绍 ## 先定义一个ControllerAdvice。代码如下 /** * @author itdog * @desc * @since 2019/6/3 11:01 */ @ControllerAdvice public class MyExceptionHandler { /** * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器 * @param binder */ @InitBinder public void initWebBinder(WebDataBinder binder){ //对日期的统一处理 binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); //添加对数据的校验 //binder.setValidator(); } /** * 把值绑定到Model中,使全局@RequestMapping可以获取到该值 * @param model */ @ModelAttribute public void addAttribute(Model model) { model.addAttribute("attribute", "The Attribute"); } /** * 捕获CustomException * @param e * @return json格式类型 */ @ResponseBody @ExceptionHandler({CustomException.class}) //指定拦截异常的类型 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //自定义浏览器返回状态码 public Map<String, Object> customExceptionHandler(CustomException e) { Map<String, Object> map = new HashMap<>(); map.put("code", e.getCode()); map.put("msg", e.getMsg()); return map; } /** * 捕获CustomException * @param e * @return 视图 */ // @ExceptionHandler({CustomException.class}) // public ModelAndView customModelAndViewExceptionHandler(CustomException e) { // Map<String, Object> map = new HashMap<>(); // map.put("code", e.getCode()); // map.put("msg", e.getMsg()); // ModelAndView modelAndView = new ModelAndView(); // modelAndView.setViewName("error"); // modelAndView.addObject(map); // return modelAndView; // } } 需要注意的是使用@ExceptionHandler注解传入的参数可以一个数组,且使用该注解时,传入的参数不能相同,也就是不能使用两个@ExceptionHandler去处理同一个异常。如果传入参数相同,则初始化ExceptionHandler时会失败。 对于@ControllerAdvice注解,我们来看看源码的定义: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] assignableTypes() default {}; Class<? extends Annotation>[] annotations() default {}; } 我们可以传递basePackage,声明的类(是一个数组)指定的Annotation参数,具体参考:[spring framework doc][] ## 2.异常的处理 ## ### 编写自定义异常类 ### package com.developlee.errorhandle.exception; /** * @author itdog * @desc * @since 2019/6/3 11:01 */ public class CustomException extends RuntimeException { private long code; private String msg; public CustomException(Long code, String msg){ this.code = code; this.msg = msg; } public long getCode() { return code; } public void setCode(long code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } Spring 对于 RuntimeException类的异常才会进行事务回滚,所以我们一般自定义异常都继承该异常类。 ### 编写全局异常处理类 ### /** * @author itdog * @desc * @since 2019/6/3 11:01 */ @ControllerAdvice("com.developlee.errorhandle") public class MyExceptionHandler { /** * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器 * @param binder */ @InitBinder public void initWebBinder(WebDataBinder binder){ } /** * 把值绑定到Model中,使全局@RequestMapping可以获取到该值 * @param model */ @ModelAttribute public void addAttribute(Model model) { model.addAttribute("attribute", "The Attribute"); } /** * 捕获CustomException * @param e * @return json格式类型 */ @ResponseBody @ExceptionHandler({CustomException.class}) //指定拦截异常的类型 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //自定义浏览器返回状态码 public Map<String, Object> customExceptionHandler(CustomException e) { Map<String, Object> map = new HashMap<>(); map.put("code", e.getCode()); map.put("msg", e.getMsg()); return map; } /** * 捕获CustomException * @param e * @return 视图 */ // @ExceptionHandler({CustomException.class}) // public ModelAndView customModelAndViewExceptionHandler(CustomException e) { // Map<String, Object> map = new HashMap<>(); // map.put("code", e.getCode()); // map.put("msg", e.getMsg()); // ModelAndView modelAndView = new ModelAndView(); // modelAndView.setViewName("error"); // modelAndView.addObject(map); // return modelAndView; // } } ### 测试 ### 在controller中抛出自定义异常 /** * @author itdog * @desc * @since 2019/6/3 11:01 */ @Controller public class DemoController { /** * 关于@ModelAttribute, * 可以使用ModelMap以及@ModelAttribute()来获取参数值。 */ @GetMapping("/one") public String testError(ModelMap modelMap ) { throw new CustomException(500L, "系统发生500异常!" + modelMap.get("attribute")); } @GetMapping("/two") public String testTwo(@ModelAttribute("attribute") String attribute) { throw new CustomException(500L, "系统发生500异常!" + attribute); } } 启动应用,范围localhost:8080/one.返回报文为: {"msg":"系统发生500异常!The Attribute","code":500} 可见我们的@InitBinder和@ModelAttribute注解生效。且自定义异常被成功拦截。如果全部异常处理都返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。@RestControllerAdvice在注解上已经添加了@ResponseBody。 [spring framework doc]: https://docs.spring.io/spring-framework/docs/5.0.0.M1/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html
相关 @ControllerAdvice统一处理异常 [@ControllerAdvice实现优雅地处理异常][ControllerAdvice] [ControllerAdvice]: https://blog.csdn.n 小鱼儿/ 2022年11月22日 05:16/ 0 赞/ 151 阅读
相关 @ControllerAdvice全局处理异常 @ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法 短命女/ 2022年11月13日 00:50/ 0 赞/ 180 阅读
相关 spring使用@ExceptionHandler、@ControllerAdvice统一异常处理 1. 自己定义的异常,继承RuntimeException。可以建个exception包,专门放自定义异常。自定义的异常用来描述自己程序中特有的异常。 朴灿烈づ我的快乐病毒、/ 2022年06月17日 13:52/ 0 赞/ 198 阅读
相关 @controllerAdvice 统一处理异常(spring-mvc) @controllerAdvice 统一处理异常(spring-mvc) 如题,利用controllerAdvice注解进行异常的统一处理。 好,下面上货。 墨蓝/ 2022年06月13日 19:59/ 0 赞/ 219 阅读
相关 SpringBoot 统一异常处理--- @ControllerAdvice 使用 > 参考慕课网地址: Aop之统一异常处理 [http://www.imooc.com/learn/810][http_www.imooc.com_learn_810] S 雨点打透心脏的1/2处/ 2022年06月04日 02:52/ 0 赞/ 217 阅读
相关 @ControllerAdvice 全局异常处理 [ControllerAdvice 文档][ControllerAdvice] 在spring 3.2中,新增了@ControllerAdvice 注解,它通常用于定义 迈不过友情╰/ 2022年04月25日 01:36/ 0 赞/ 253 阅读
相关 使用@ControllerAdvice处理异常 在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@Init 谁借莪1个温暖的怀抱¢/ 2022年01月23日 08:27/ 0 赞/ 206 阅读
相关 【java异常】 @ControllerAdvice+@ExceptionHandler全局异常处理 查看 @ControllerAdvice源码可见,添加了@Component; 则@ControllerAdvice是spring的一个组件,可理解为一个实体Bean, 叁歲伎倆/ 2021年12月05日 01:13/ 0 赞/ 324 阅读
相关 springboot全局异常处理 --- @ControllerAdvice 1、首先我们可以针对自己的业务创建自定义异常,系统层面,业务方面等 我们系统业务层统一使用BizException,这个是自定义的。 2、配置controllerAd 偏执的太偏执、/ 2021年11月22日 13:50/ 0 赞/ 390 阅读
还没有评论,来说两句吧...