在项目中,我们会遇到各种各样的业务异常,业务异常是指业务处理时,由于某些业务的特殊要求而导致处理不能继续而抛出异常.比如说检测用户输入的内容中是否包含敏感词汇.我们希望这些业务异常能够被统一处理,接下来就是如何处理全局异常.
- 首先,统一封装自定义业务异常
BusinessException
.package com.example.test.error; /** * 描述:业务异常 * @Author zhangrui * @Date 2019/10/31 11:50 */ public class BussinessException extends RuntimeException { public BussinessException(){} public BussinessException(String message){ super(message); } }
- 然后,新建错误信息类
ErrorInfo
package com.example.test.error; /** * 描述:错误信息类 * @Author zhangrui * @Date 2019/10/31 11:51 */ @Data public class ErrorInfo<T> { public static final Integer SUCCESS = 200; public static final Integer ERROR = 100; //错误信息 private Integer code; //错误码 private String message; private String url; private T data; }
- 其次,新建统一异常处理类
GlobalDefaultExceptionHandler
package com.example.test.error; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /** * 描述:统一业务异常处理类 * @Author zhangrui * @Date 2019/10/31 11:54 */ @ControllerAdvice(basePackages = {"com.example.test",})//定义统一的异常处理类 public class GlobalDefaultExceptionHandler { @ExceptionHandler({BussinessException.class})//用来定义函数针对的异常类型,可以传入多个需要捕获的异常类 @ResponseBody public ErrorInfo defaultErrorHandler(HttpServletRequest req,Exception e) throws Exception{ System.out.println("req.getRequestURI():"+req.getRequestURI()); ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setMessage(e.getMessage()); errorInfo.setUrl(req.getRequestURI()); errorInfo.setCode(ErrorInfo.SUCCESS); return errorInfo; } }
- 最后,在控制层添加方法
findAll()
,并在方法中抛出BusinessException
异常,该异常会被全局异常处理类捕获.package com.example.test.controller; import com.example.test.error.BussinessException; import com.example.test.entity.User; import com.example.test.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource; import java.util.List; @Controller @RequestMapping("/user") public class UserController { @Resource private UserService userService; @RequestMapping("/findAll") public String findAll(Model model) { List<User> user = userService.findAll(); model.addAttribute("users", user); throw new BussinessException("业务异常"); } }
代码开发完成之后,重启项目,在浏览器中输入访问地址
http://localhost:8080/user/findAll
,可以看到后端返回的json信息。