可以使用@ControllerAdvice注解,编写一个全局异常处理类,再自定义一个方法使用@ExceptionHandler来捕获具体的异常并作相应的处理。
通常情况下后台向前台返回结果时,会把结果封装成包含有错误码,错误信息以及数据本身的json数据,因此我们可以使用自定义异常类,自定义枚举错误码,在捕获全局异常后,向前台返回一个包含错误码的信息。
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.nio.file.AccessDeniedException;
import java.util.List;
/**
* 全局异常处理
*/
//@RestController //Controller+ResponseBody
//@RestControllerAdvice : 是对@RestController的增强,拥有@RestController的能力
//且注解了该注解的类下面的方法可以在其他controller执行前,后,做一些事情
@RestControllerAdvice
public class GlobleExceptionHandler {
//异常处理 , ExceptionHandler 的作用是捕获异常,通过value指定要捕获的异常
@ExceptionHandler(value = GlobleException.class)
public AjaxResult globleExceptionHandler(GlobleException e){
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
}
@ExceptionHandler(value = AccessDeniedException.class)
public AjaxResult accessDeniedExceptionHandler(AccessDeniedException e){
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
}
//异常处理 , ExceptionHandler 的作用是捕获异常,通过value指定要捕获的异常
@ExceptionHandler(value = Exception.class)
public AjaxResult exceptionHandler(Exception e){
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("系统内部异常");
}
//异常处理 , ExceptionHandler 的作用是捕获异常,通过value指定要捕获的异常
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public AjaxResult beanValidExceptionHandler(MethodArgumentNotValidException e){
e.printStackTrace();
StringBuilder sb = new StringBuilder();
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
allErrors.forEach(err->{
String defaultMessage = err.getDefaultMessage();
sb.append(defaultMessage).append(" ; ");
});
return AjaxResult.me().setSuccess(false).setMessage(sb.toString());
}
}
/**
* 全局异常
*/
public class GlobleException extends RuntimeException{
public GlobleException(){
}
public GlobleException(String message){
super(message);
}
}