@RestControllerAdvice
public class ApiExceptionHandler {
private static Logger log = LoggerFactory.getLogger(ApiExceptionHandler.class);
// 对表单验证时抛出的 MethodArgumentNotValidException 异常做统一处理
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> validException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> errors = bindingResult.getAllErrors();
if (!errors.isEmpty()) {
// 只显示第一个错误信息
ErrorBody body = new ErrorBody(HttpStatus.BAD_REQUEST.value(), errors.get(0).getDefaultMessage());
return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>("valid error", HttpStatus.BAD_REQUEST);
}
// 业务异常的默认处理方式
@ExceptionHandler(BusinessException.class)
public ResponseEntity<?> businessException(BusinessException e) {
ErrorBody body = new ErrorBody(e.getCode(), e.getMessage());
return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
}
// 代码异常的处理方式
@ExceptionHandler(Exception.class)
public ResponseEntity<?> defaultHandler(Exception e) {
log.error(e.getMessage(), e);
ErrorBody body = new ErrorBody(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
ErrorBody
public class ErrorBody {
private Integer code;
private String message;
private long timestamp = System.currentTimeMillis();
public ErrorBody(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
BusinessException
public class BusinessException extends RuntimeException {
private Integer code;
public BusinessException(Integer code) {
this.code = code;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}