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<String> 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<FieldError> 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());
|
}
|
}
|