一般我们定义了DTO来接收参数,然后使用@validated来验证DTO里面的校验规则。当我们的接口接收的参数为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层使用该工具类,即可进行参数的校验。