springboot中注解校验@Valid@Validated(亲测有效)
1.bean validation校验框架说明
2.常⽤校验⽅式
2.1 参数为对象校验⽅式(@RequestBody+@Vallid)
2.2 参数为单个参数校验⽅式
2.3 分组校验(公共对象参数,对于指定参数,有的接⼝需要校验,有的接⼝不需要校验的场景) 2.4 级联校验
2.5 ⾃定义注解
2.5.1 ⾃定义注解进⾏关联校验
2.5.2 同⼀个⾃定义注解对多个对象进⾏相同关联校验
3.校验源码说明
1.bean validation校验框架说明
JSR,Java Specification Requests 的缩写,意思是 Java 规范提案。JSR-303 是JAVA EE 6 中的⼀项⼦规范,叫做 Bean Validation。Hibernate Validator 是 Bean Validation接⼝规范 的实现之⼀。
@Valid与@Validated区别:后者是前者的补充,前者能做的后者都能做,并且后者⽀持分组、级联操作等。
2.常⽤校验⽅式
需要引⼊依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
2.1 参数为对象校验⽅式
1.校验步骤说明
1.请求对象上添加注解@RequestBody @Valid(源⾃javax.validation.Valid);
2.对象实体类中添加相关校验注解(源于straints).
2.⽰例说明
1.请求类
package com.kawaxiaoyu.ller;
import com.kawaxiaoyu.api.appointCourse.dto.ApplyInfoDto;
import com.kawaxiaoyu.api.appointCourse.service.impl.AppointCourseServiceImp;
kidea.springbootplus.frameworkmon.api.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: AppointCourseController
* @Desc: 约课内容管理
* @Author: txm
* @Date: 2021/8/31 18:09
**/
@RequestMapping("/appoint")
@RestController
validation框架public class AppointCourseController {
@Autowired
private AppointCourseServiceImp appointCourseService;
/**
* @Author: txm
* @Description: 添加线上课程申请
* @Param: [applyInfoDto]
* @return: io.geekidea.springbootplus.frameworkmon.api.ApiResult
* @Date:  2021/9/1 15:49
**/
@PostMapping("/addApplyCourseInfo")
public ApiResult addApplyCourseInfo(@RequestBody @Valid ApplyInfoDto applyInfoDto){        appointCourseService.addApplyCourseInfo(applyInfoDto);
return ApiResult.ok();
}
}
2.请求对象实体类
11位⼿
2.2 参数为单个参数校验⽅式
场景说明:接⼝中只对⼀个参数进⾏校验
controller类上添加@Validated,标识整个类可以进⾏注解校验;⽅法参数上添加校验注解.
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import straints.Min;
@RequestMapping("/test")
@RestController
@Validated
public class TestController {
@GetMapping("/course")
public String test( @Min(value = 1,message = "不允许为0") Integer id){
// 业务代码省略
}
}
2.3 分组校验
场景说明,查询传递参数对象中CourseTableDto为两个接⼝的公共参数,其中⼀个接⼝对type字段有⼤⼩限制要求,另⼀个接⼝对此字段没有限制.
CourseTableDto对象参数:
public class CourseTableDto {
@Min(value = 1,message = "瑜伽馆id不允许为空")
private int studioId;
@Range(min = 1,max = 2,message = "课程类型:1.团课,2⼩班课")
private int type;
@Pattern(regexp = "((20)[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])",message = "时间格式⽀持:yyyy-MM-dd")
private String dateTime;
// 省略get/set
}
实现⽅式:@validated注解分组完成.
1.⾃定义两个接⼝,分别标识校验是否校验type字段
/**
* @ClassName: CourseTableDtoNoType
* @Desc: CourseTableDto中不进⾏校验type
* @Author: txm
* @Date: 2021/9/7 11:35
**/
public interface CourseTableDtoNoType {
}
/**
* @ClassName: CourseTableDtoType
* @Desc: CourseTableDto中分组校验type类型
* @Author: txm
* @Date: 2021/9/7 11:34
**/
public interface CourseTableDtoType {
}
2.CourseTableDto中带有校验注解字段中添加分组属性,表明校验类型为⾃定分组,⾮默认分组
带有校验注解的字段的注解中添加group属性:groups = CourseTableDtoType.class.
public class CourseTableDto {
@Min(value = 1,message = "瑜伽馆id不允许为空")
private int studioId;
@Range(min = 1,max = 2,message = "课程类型:1.团课,2⼩班课",groups = CourseTableDtoType.class)
private int type;
@Pattern(regexp = "((20)[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])",message = "时间格式⽀持:yyyy-MM-dd")
private String dateTime;
// 省略get/set
}
@Validated中添加分组标记接⼝:@Validated(value = {CourseTableDtoType.class,Default.class})
@PostMapping("/findPersonalTeacherListByDay")
public ApiResult findStudioCourseTablesByDay(@RequestBody @Validated(value = {CourseTableDtoType.class,Default.class}) CourseTableDto courseTableD      // 业务实现已忽略
}
注意:其他字段默认分组是Default.class(ups.Default),如果不添加的话其他字段会上的校验注解不会⽣效.具体原因说
明可以参考:
4.测试两个接⼝是否只有⼀个校验type效果
不校验type字段的显⽰正常(type可以不传递或是数据值任意)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。