失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SpringBoot参数校验--List类型

SpringBoot参数校验--List类型

时间:2019-09-14 15:29:12

相关推荐

SpringBoot参数校验--List类型

我们在写后台接口的时候,通常会定义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;@Datapublic 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类型的参数*/@Testpublic 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 /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类如下所示:

publicclassItem{@NotNull(message="id不能为空")@Min(value=1,message="id必须为正整数")privateLongid;@Valid//嵌套验证必须用@Valid@NotNull(message="props不能为空")@Size(min=1,message="props至少要有一个自定义属性")privateList<Prop>props;}

如果觉得《SpringBoot参数校验--List类型》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。