写点什么

Spring 使用 Validation 验证框架的问题详解,springboot 原理

  • 2021 年 11 月 10 日
  • 本文字数:1399 字

    阅读完需:约 5 分钟

可注解位置:可以用在类型、方法和方法参数上。但是不能用在成员属性上


嵌套验证:用在方法入参上无法单独提供嵌套验证功能;不能用在成员属性上;也无法提供框架进行嵌套验证;能配合嵌套验证注解 @Valid 进行嵌套验证。


2.Valid


分组:无分组功能


可注解位置:可以用在方法、构造函数、方法参数和成员属性上(两者是否能用于成员属性上直接影响能否提供嵌套验证的功能)


嵌套验证:用在方法入参上无法单独提供嵌套验证功能;能够用在成员属性上,提示验证框架进行嵌套验证;能配合嵌套验证注解 @Valid 进行嵌套验证。


二、使用



1. SpringBoot 2.3.0 后需要添加依赖

<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-validation</artifactId>


</dependency>

2. 配置 validation 使出现校验失败即返回

@Configuration


public class WebConfig {


@Bean


public Validator validator() {


ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)


.configure()


//failFast 的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。


.failFast(true)


.buildValidatorFactory();


return validatorFactory.getValidator();


}


@Bean


public MethodValidationPostProcessor methodValidationPostProcessor() {


MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();


methodValidationPostProcessor.setValidator(validator());


return methodValidationPostProcessor;


}


}

3. 编写全局异常捕获,捕获验证失败,统一返回

@Slf4j


@ControllerAdvice


public class ValidatedExceptionHandler {


@ResponseBody


@ExceptionHandler(BindException.class)


public String exceptionHandler2(BindException exception) {


BindingResult result = exception.getBindingResult();


if (result.hasErrors()) {


return result.getAllErrors().get(0).getDefaultMessage();


}


return "参数不可为空!";


}


@ResponseBody


@ExceptionHandler(MethodArgumentNotValidException.class)


public String exceptionHandler2(MethodArgumentNotValidException exception) {


BindingResult result = exception.getBindingResult();


if (result.hasErrors()) {


return result.getAllErrors().get(0).getDefaultMessage();


}


return "参数不可为空!";


}


}

4. 定义 Dto,在参数上添加注解校验

@Data


public class ValidDto {


@NotEmpty(message = "name 不可为空!")


private String name;


@NotBlank(message = "userId 不可为空!")


private String userId;


@Min(value = 1, message = "年龄有误!")


@Max(value = 120, message = "年龄有误!")


private int age;


@NotBlank(message = "邮箱不可为空!")


@Email(message = "邮箱有误!")


private String email;


@NotBlank(message = "mobile 不可为空!")


@Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$", message = "手机号码有误!")


private String mobile;


@NotNull(message = "validVo 不可为空!")


@Valid


privat


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


e ValidVo validVo;


@NotEmpty(message = "list1 不可为空!")


@Size(min = 1, max = 2, message = "list1 数据过大")


@Valid


private List<ValidVo> list1;


}

评论

发布
暂无评论
Spring 使用Validation 验证框架的问题详解,springboot原理