SpringBoot参数校验--List类型

本文介绍了一种在Java中高效校验List类型参数的方法,利用ValidatorUtils工具类结合@Valid和@Validated注解,实现对DTO中复杂验证规则的支持,确保数据的完整性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    我们在写后台接口的时候,通常会定义DTO来接收参数,在DTO中使用注解书写验证的规则;然后在Controller层使用@validated注解来验证自己制定的校验规则。但当我们的接口接收的参数为List<E>时,可以使用本文的方法进行校验。注:工具类部分代码在最后

包含验证规则的实体类:

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

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
public class SingleDTO {
    @ApiModelProperty(value = "主键ID", required = true)
    @NotBlank(message = "缺少参数:主键ID")
    @Pattern(regexp = "[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}",message = "主键ID格式有误:UUID格式")
    private String pkId;
}

 

参数校验:

import com.wingconn.aeocustoms.domain.dto.SingleDTO;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ValidatorUtilsTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtilsTest.class);

    private static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }

    /**
     * Controller层验证List类型的参数
     */
    @Test
    public void validate() {
        List<SingleDTO> dtos = new ArrayList<>();
        SingleDTO singleDTO =  new SingleDTO();
        singleDTO.setPkId("12345678990");
        dtos.add(singleDTO);
        Validator validator = createValidator();
        for(SingleDTO dto : dtos) {
            Set<ConstraintViolation<SingleDTO>> violations  = validator.validate(dto);
            if (violations.size() == 0) {
                LOGGER.debug("No violations.");
                System.out.println("success");
            }else {
                LOGGER.error("%s violations:%n", violations.size());
                for(ConstraintViolation<SingleDTO> violation :violations){
                    LOGGER.error("参数:"+violation.getPropertyPath() + "  " + violation.getMessage());
                }
            }
        }
    }

}

用参数“1234567890”进行单元测试,结果为:

 

用参数“c076de6c-aeb3-4882-ba6c-a886942c53c4”进行单元测试,结果为:

单元测试表明该工具类可以使用。实际使用时,直接在Controller层使用该工具类,即可进行参数的校验。

工具类部分代码(缺少了返回值的实体类): 

package com.XXX.aasmgt.util;

import com.XXX.to.resultTo.ResultTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.*;
import java.util.List;
import java.util.Set;

/**
 * @author fusc
 * @date 2018/10/9 17:23
 */
public class ValidatorUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtils.class);

    private static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }

    /**
     * Controller层验证List类型的参数
     *
     * @return
     */
    public static <T> ResultTO validate(List<T> list) {
        Validator validator = createValidator();
        for (T dto : list) {
            Set<ConstraintViolation<T>> violations = validator.validate(dto);
            if (violations.size() == 0) {
                LOGGER.debug("No violations.");
                return ResultTO.operateSuccess();
            } else {
                LOGGER.error("%s violations:%n", violations.size());
                for (ConstraintViolation<T> violation : violations) {
                    LOGGER.error("参数:" + violation.getPropertyPath() + "  " + violation.getMessage());
                    return ResultTO.errorByInvalidParams(violation.getMessage());
                }
            }
        }
        return ResultTO.errorByInvalidParams("参数有误:参数列表为空!");
    }
}

************************************************************************************************************************************************* 

 另外一种方式( 摘抄自公众号“Java技术栈”)

为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

我们修改Item类如下所示:

public class Item {

    @NotNull(message = "id不能为空")
    @Min(value = 1, message = "id必须为正整数")
    private Long id;

    @Valid // 嵌套验证必须用@Valid
    @NotNull(message = "props不能为空")
    @Size(min = 1, message = "props至少要有一个自定义属性")
    private List<Prop> props;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值