可以通过@RestControllerAdvice来处理全局异常。启动应用后,被@ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在被@RequestMapping注解的方法上。
自定义全局异常处理类:
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(value = ShiroException.class)
public Result handler(ShiroException e){
log.error("运行时异常:。。。。。。。。{}",e);
return Result.fail(e.getMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handler(MethodArgumentNotValidException e){
log.error("实体校验异常:。。。。。。。。{}",e);
BindingResult bindingResult = e.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
System.out.println(objectError);
return Result.fail(objectError.getDefaultMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = RuntimeException.class)
public Result handler(RuntimeException e){
log.error("运行时异常:。。。。。。。。{}",e);
return Result.fail(e.getMessage());
}
}
当被@RequestMapping注释的方法上出现以上异常时,就会自动处理。
@GetMapping("/blog/{id}")
public Result detail(@PathVariable(name = "id") Long id) {
Blog blog = blogService.getById(id);
Assert.notNull(blog, "该博客已被删除");
return Result.success(blog);
}