MyControllerAdvice.java 3.11 KB
package cn.fw.dalaran.server.config;

import cn.fw.dalaran.common.exception.BusinessException;
import cn.fw.data.base.domain.common.Message;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author wmy3969
 * @version 1.0
 * @date 2022/7/26 10:39
 * @Description 异常拦截器
 */
@RestControllerAdvice
public class MyControllerAdvice {

    /**
     * 参数校验未通过异常处理(校验注解在实体类中)
     */
    @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
    public Message<String> exception(Exception e) {
        List<ObjectError> allErrors = new ArrayList<>();
        if (e instanceof MethodArgumentNotValidException)
            allErrors = ((MethodArgumentNotValidException) e).getBindingResult().getAllErrors();
        else if (e instanceof BindException)
            allErrors = ((BindException) e).getBindingResult().getAllErrors();
        StringBuilder sb = new StringBuilder();
        int size = allErrors.size();
        if (size > 0) {
            for (int i = 0; i < size; i++) {
                FieldError error = (FieldError) allErrors.get(i);
                sb.append("「");
                sb.append(error.getField());
                sb.append("」");
                sb.append(error.getDefaultMessage());
                if (i < size - 1)
                    sb.append(",");
            }
        }
        return Message.failure(50500, sb.toString());
    }

    /**
     * 参数校验未通过异常处理(校验注解在方法参数列表上)
     */
    @ExceptionHandler(value = ConstraintViolationException.class)
    public Message<String> exception(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> set = e.getConstraintViolations();
        StringBuilder sb = new StringBuilder();
        int size = set.size();
        if (size > 0) {
            ArrayList<ConstraintViolation<?>> list = new ArrayList<>(set);
            for (int i = 0; i < size; i++) {
                final ConstraintViolation<?> error = list.get(i);
                sb.append("「");
                sb.append(((PathImpl) error.getPropertyPath()).getLeafNode().getName());
                sb.append("」");
                sb.append(error.getMessageTemplate());
                if (i < size - 1)
                    sb.append(",");
            }
        }
        return Message.failure(50501, sb.toString());
    }

    /**
     * BusinessException
     */
    @ExceptionHandler(value = {BusinessException.class})
    public Message<String> handleException(BusinessException e) {
        return Message.failure(50502, e.getMessage());
    }

}