Skip to content

参数校验器

工具说明

定义统一异常处理器

这里只处理IllegalArgumentException和MethodArgumentNotValidException

本文虽只用到了IllegalArgumentException但是也是对验证码文章中的参数组序(CPGroup)接口的补充,因此保留了MethodArgumentNotValidException

java
import com.lh.api.ApiResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * @ClassName CommonExceptionHandler
 * @Author liupengxiang
 * @Date 2023/6/29 13:57
 * @Description 统一异常处理类
 */
@RestControllerAdvice
public class CommonExceptionHandler {
    
    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseBody
    public ApiResult<?> illegalArgumentExceptionHandler(IllegalArgumentException illegalArgumentException) {
        illegalArgumentException.printStackTrace();
        return ApiResult.build(500, illegalArgumentException.getMessage());
    }
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ApiResult<?> exceptionHandler(MethodArgumentNotValidException exception) {
        BindingResult bindingResult = exception.getBindingResult();
        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
        if (bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();
            if (!errors.isEmpty()) {
                // 列出全部错误参数
                FieldError fieldError = (FieldError) errors.get(0);
                return ApiResult.build(500,fieldError.getDefaultMessage());
            }
        }
        return ApiResult.build(500,"参数异常");
    }
}

工具类

java

import com.lautrans.exception.InventoryNotEnoughException;
import org.springframework.util.ObjectUtils;

/**
 * @ClassName ParamsChecker
 * @Author liupengxiang
 * @Date 2023/7/11 14:55
 * @Description 参数校验器
 */
@Component
public class ParamsChecker {

    private static final Integer INIT_SERIAL = 1;
    private static final Integer END_SERIAL = 2;
    
    /**
     * 参数校验
     * @param elements 参数 格式: 参数名,参数,参数名,参数...
     */
    public static void check(Object... elements) {
        var serial = INIT_SERIAL;
        Object parameter = null;
        for (Object element : elements) {
            if (serial.equals(INIT_SERIAL)) {
                parameter = element;
            }
            if (serial.equals(END_SERIAL)) {
                if (ObjectUtils.isEmpty(element)) {
                    throw new IllegalArgumentException(parameter.toString());
                }
            }
            serial ++;
            if (serial > END_SERIAL) {
                serial = INIT_SERIAL;
                parameter = null;
            }
        }
    }
}

使用

参数是成对的第一个参数为参数说明,第二个参数为参数名

java
ParamsChecker.check("活动id不能为空",actId,"规格id不能为空",customId);