SpringBoot @ControllerAdvice注解自定义全局异常处理类 统一处理异常

 

在Springboot或者Springcloud开发中为了统一处理业务异常,需要自定义全局异常处理类统一处理业务异常。在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping注解的方法中,本篇内容笔者讲解一下使用@ControllerAdvice和@ExceptionHandler注解,自定义全局异常处理类,统一处理异常。

一、@ExceptionHandler注解介绍

启动应用后,@ExceptionHandler注解都会作用在被@RequestMapping注解的方法上。

@ExceptionHandler 拦截了异常,我们可以通过该注解的value实现自定义异常拦截处理。其中,@ExceptionHandler 配置的 value 指定需要拦截的异常类型。

二、自定义业务异常类和全局异常处理类

1、编写自定义业务异常类:

  1. package com.demo.serverProvider.entity;

  2.  
  3. /**

  4. * 创建时间:2019年3月2日 上午11:22:09

  5. * 项目名称:server-provider

  6. * 类说明:自定义业务异常类

  7. * @author guobinhui

  8. * @since JDK 1.8.0_51

  9. */

  10. public class BizException extends RuntimeException{

  11.  
  12. private static final long serialVersionUID = 2870428181462432015L;

  13.  
  14. private String code;

  15. private String msg;

  16.  
  17. public BizException(String code, String msg) {

  18. this.code = code;

  19. this.msg = msg;

  20. }

  21.  
  22. public String getCode() {

  23. return code;

  24. }

  25.  
  26. public void setCode(String code) {

  27. this.code = code;

  28. }

  29.  
  30. public String getMsg() {

  31. return msg;

  32. }

  33.  
  34. public void setMsg(String msg) {

  35. this.msg = msg;

  36. }

  37. }

注:spring 对于 RuntimeException 异常才会进行事务回滚。

2、编写全局异常处理类

  1. package com.demo.serverProvider.handler;

  2.  
  3. import java.util.HashMap;

  4. import java.util.Map;

  5.  
  6. import org.springframework.web.bind.annotation.ControllerAdvice;

  7. import org.springframework.web.bind.annotation.ExceptionHandler;

  8. import org.springframework.web.bind.annotation.ResponseBody;

  9.  
  10. import com.demo.serverProvider.entity.BizException;

  11.  
  12. /**

  13. * 创建时间:2019年3月2日 上午11:27:02

  14. * 项目名称:server-provider

  15. * 类说明:自定义全局异常处理类

  16. * @author guobinhui

  17. * @since JDK 1.8.0_51

  18. */

  19. @ControllerAdvice

  20. public class GlobalExceptionHandler {

  21.  
  22. /**

  23. * 全局异常捕捉处理

  24. * @param ex

  25. * @return

  26. */

  27. @ResponseBody

  28. @ExceptionHandler(value = Exception.class)

  29. public Map<String,Object> defaultExceptionHandler(Exception ex) {

  30. Map <String,Object> map = new HashMap <String,Object> ();

  31. map.put("code", 500);

  32. map.put("msg", ex.getMessage());

  33. return map;

  34. }

  35.  
  36. /**

  37. * 拦截捕捉自定义业务异常 BizException.class

  38. * @param ex

  39. * @return

  40. */

  41. @ResponseBody

  42. @ExceptionHandler(value = BizException.class)

  43. public Map<String,Object> defaultExceptionHandler(BizException ex) {

  44. Map<String,Object> map = new HashMap<String,Object>();

  45. map.put("code", ex.getCode());

  46. map.put("msg", ex.getMsg());

  47. return map;

  48. }

  49. }

3、controller中抛出异常进行测试

  1. package com.demo.serverProvider.controller;

  2.  
  3. import java.util.ArrayList;

  4. import java.util.Iterator;

  5. import java.util.List;

  6. import org.springframework.web.bind.annotation.RequestMapping;

  7. import org.springframework.web.bind.annotation.RestController;

  8.  
  9. import com.demo.serverProvider.entity.BizException;

  10.  
  11. /**

  12. * 创建时间:2019年3月1日 下午4:03:44

  13. * 项目名称:server-provider

  14. * 类说明:

  15. * @author guobinhui

  16. * @since JDK 1.8.0_51

  17. */

  18. @RestController

  19. @RequestMapping(value="/fileHandler")

  20. public class ReadFilesController {

  21.  
  22. @RequestMapping("/test")

  23. public String test() throws BizException{

  24. StringBuffer message = new StringBuffer();

  25. message.append("出现异常:【");

  26. throw new BizException("400", message.toString() +"数据错误】");

  27. }

  28. }

启动应用,访问:http://localhost:8891/fileHandler/test,正常显示以下json内容,证明业务异常已经被自定义异常处理类成功拦截

  1. <Map>

  2. <msg>出现异常:【数据错误】</msg>

  3. <code>400</code>

  4. </Map>

如果不需要返回json数据,而要渲染某个页面模板返回给浏览器,那么异常处理类GlobalExceptionHandler中可以这么实现:

  1. @ExceptionHandler(value = BizException.class)

  2. public ModelAndView defaultExceptionHandler(BizException ex) {

  3. ModelAndView modelAndView = new ModelAndView();

  4. modelAndView.setViewName("error");

  5. modelAndView.addObject("code", ex.getCode());

  6. modelAndView.addObject("msg", ex.getMsg());

  7. return modelAndView;

  8. }

在 templates 目录下,添加 error.ftl(这里使用freemarker) 进行渲染:

  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>异常页面</title>

  6. </head>

  7. <body>

  8. <h1>${code}</h1>

  9. <h1>${msg}</h1>

  10. </body>

  11. </html>

重启应用,http://localhost:8891/fileHandler/test 显示自定义的异常页面内容。

猜你喜欢

转载自blog.csdn.net/It_BeeCoder/article/details/93398815