package com.doumee.jtt808.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.yzh.commons.model.APICodes; import org.yzh.commons.model.APIException; import org.yzh.commons.model.APIResult; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @RestControllerAdvice public class ExceptionController { private static final Logger log = LoggerFactory.getLogger(ExceptionController.class); private static final Pattern compile = Pattern.compile("'\\w*'"); // @ExceptionHandler(Exception.class) // public APIResult onException(Exception e) { // log.error("系统异常", e); // return new APIResult<>(e); // } @ExceptionHandler(APIException.class) public APIResult onAPIException(APIException e) { return new APIResult<>(e); } @ExceptionHandler(SQLException.class) public APIResult onSQLException(SQLException e) { String message = e.getMessage(); if (message.endsWith("have a default value")) return new APIResult<>(APICodes.MissingParameter, e); log.warn("系统异常:", e); return new APIResult<>(e); } @ExceptionHandler(DuplicateKeyException.class) public APIResult onDuplicateKeyException(DuplicateKeyException e) { Matcher matcher = compile.matcher(e.getCause().getMessage()); List values = new ArrayList<>(4); while (matcher.find()) values.add(matcher.group()); int size = values.size(); int len = size < 2 ? size : (size / 2); StringBuilder sb = new StringBuilder(20); sb.append("已存在的号码:"); for (int i = 0; i < len; i++) sb.append(values.get(i)).append(','); return new APIResult<>(APICodes.InvalidParameter, sb.substring(0, sb.length() - 1)); } @ExceptionHandler(IllegalArgumentException.class) public APIResult onIllegalArgumentException(IllegalArgumentException e) { log.warn("系统异常:", e); return new APIResult<>(APICodes.InvalidParameter, e.getMessage()); } @ExceptionHandler(HttpMessageNotReadableException.class) public APIResult onHttpMessageNotReadableException(HttpMessageNotReadableException e) { log.warn("系统异常:", e); return new APIResult<>(APICodes.TypeMismatch, e); } @ExceptionHandler(BindException.class) public APIResult onBindException(BindException e) { List fieldErrors = e.getFieldErrors(); StringBuilder sb = new StringBuilder(); for (FieldError fieldError : fieldErrors) sb.append(fieldError.getField()).append(fieldError.getDefaultMessage()); return new APIResult<>(APICodes.MissingParameter, sb.toString()); } @ExceptionHandler(HttpMediaTypeException.class) public APIResult onHttpMediaTypeException(HttpMediaTypeException e) { log.warn("系统异常:", e); return new APIResult<>(APICodes.NotSupportedType, e.getMessage()); } @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public APIResult onHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { return new APIResult<>(APICodes.NotImplemented); } @ExceptionHandler(MissingServletRequestParameterException.class) public APIResult onMissingServletRequestParameterException(MissingServletRequestParameterException e) { return new APIResult<>(APICodes.MissingParameter, ":" + e.getParameterName()); } @ExceptionHandler(MethodArgumentTypeMismatchException.class) public APIResult onMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) { return new APIResult<>(APICodes.TypeMismatch, ":" + e.getName() + "=" + e.getValue(), e.getMessage()); } }