使用@ControllerAdvice横切所有controller,再使用@ExceptionHandler处理各种异常
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
private GlobalExceptionHandler() {
}
/**
* 处理@Valid校验失败的异常,加大括号可传数组对多种异常进行通用处理
*/
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity<Result<?>> methodArgumentNotValidException(MethodArgumentNotValidException e) {
List<FieldError> errors = e.getBindingResult().getFieldErrors();
StringBuilder builder = new StringBuilder();
for(int i=0; i<errors.size(); i++){
FieldError error = error.get(i);
String message = StringUtils.isNotBlank(error.getDefaultMessage())?error.getDefaultMessage() : "参数异常";
builder.append(error.getField()).append(message);
if(i <errors.size() -1) {
builder.append(";");
}
}
Result<?> result = Result.error("12345",builder.toString());
log.error("Params valid exception={}",e.getMessage(),e);
return new ResponseEntity<>(result,HttpStatus.BAD_REQUEST);
}
// 其他需要单独处理的exception自行补充
/**
* 捕获其他所有未单独处理的exception
*/
@ExceptionHandler(Exception.class)
public ResponseEntity<Result<?>> globalHandle(Exception e) {
String message = "系统异常";
if(!StringUtils.isEmpty(e.getMessage())) {
message = e.getMessage();
}
Result<?> result = Result.error("11111",message );
log.error("unknown exception={}",e.getMessage(),e);
return new ResponseEntity<>(result,HttpStatus.INTERNAL_SERVER_ERROR);
}
}