Spring注解校验@Valid的手动调用

发布时间 2023-06-05 16:36:58作者: 代码即正义

在做Spring项目的时候,@Valid可以完成优雅的参数校验,但是在不少特殊场景下,会有字段组合校验的场景.这种情况下,就需要在后台手动校验,那么如何在后端也优雅的参数校验,避免一堆判断和抛异常呢,可以试试在满足校验场景下手动触发@Valid校验.

1. 第一步:定义校验对象

点击查看代码
package com.sf.wms.finance.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * 自定义参数校验测试DTO
 */
@ApiModel(value = "SelfTestDTO", description = "自定义参数校验测试DTO")
@Data
public class SelfTestDTO {

    @ApiModelProperty(value = "规则名")
    @NotNull(message = "请输入规则名")
    @Size(max = 25 , message = "规则名不能超过25个字符")
    private String ruleName;

}

2. 第二步:自定义校验方法

点击查看代码
package com.sf.wms.finance.hanlder;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;


@Component
public class SelfValid {

    private static Validator validator;

    /**
     * 工具类自然需要静态注入
     * @param validator
     */
    @Autowired
    public void setValidator(Validator validator) {
        SelfValid.validator = validator;
    }

    public static void selfValid(Object t) {
        Set<ConstraintViolation<Object>> set = validator.validate(t);
        StringBuilder stringBuilder = new StringBuilder();
        if (set.size() > 0) {
            stringBuilder.append("校验不通过!");
        } else {
            return ;
        }
        for (ConstraintViolation<Object> constraintViolation : set) {
            stringBuilder.append(constraintViolation.getMessage());
        }
        throw new RuntimeException(stringBuilder.toString());
    }

}

3. 第三步,特殊场景下手动调用自定义校验方法

点击查看代码
// 当满足条件的时候 -> 调用
if(true){
    mkSaveDTOList.forEach(mkSaveDTO ->  SelfValid.selfValid(mkSaveDTO));
}