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