目录
4.随后在controller接收参数的时候加上个@Validated
前言
在日常开发中,我们现在是否在service里面对接口接收的参数进行校验,其实这种方法也是行得通,但是若接口接收的是一个类,类里面有很多属性,这时我们对类里的一个个属性进行校验是比较麻烦的,如下面代码:
public CourseBaseInfoDto addCourse(Long companyId, AddCourseDto dto) {
//合法性校验,对类中每个属性进行校验
if (StringUtils.isBlank(dto.getName())) {
throw new XueChengPlusException("课程名称为空");
}
if (StringUtils.isBlank(dto.getMt())) {
throw new XueChengPlusException("课程分类为空");
}
if (StringUtils.isBlank(dto.getSt())) {
throw new XueChengPlusException("课程分类为空");
}
if (StringUtils.isBlank(dto.getGrade())) {
throw new XueChengPlusException("课程等级为空");
}
if (StringUtils.isBlank(dto.getTeachmode())) {
throw new XueChengPlusException("教育模式为空");
}
if (StringUtils.isBlank(dto.getUsers())) {
throw new XueChengPlusException("适应人群");
}
if (StringUtils.isBlank(dto.getCharge())) {
throw new XueChengPlusException("收费规则为空");
}
}
所以我们需要借助 JSR303校验,就是简单在类中加几个注解,就可以在controller中对接口的参数进行校验,大大增加开发的效率
一、JSR303是什么?
早在JavaEE6规范中就定义了参数校验的规范,它就是JSR-303,它定义了Bean Validation,即对bean属性进行校验。
SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底层使用Hibernate Validator,Hibernate Validator是Bean Validation 的参考实现。
二、基本使用
1.引入依赖
spring-boot-starter-validation的依赖 :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.在类上加上注解
就以上面那个类为示例给类的属性加上校验注解:
@Data
@ApiModel(value="AddCourseDto", description="新增课程基本信息")
public class AddCourseDto {
@NotEmpty(message = "课程名称不能为空")
@ApiModelProperty(value = "课程名称", required = true)
private String name;
@NotEmpty(message = "适用人群不能为空")
@Size(message = "适用人群内容过少",min = 10)
@ApiModelProperty(value = "适用人群", required = true)
private String users;
@ApiModelProperty(value = "课程标签")
private String tags;
@NotEmpty(message = "课程分类不能为空")
@ApiModelProperty(value = "大分类", required = true)
private String mt;
@NotEmpty(message = "课程分类不能为空")
@ApiModelProperty(value = "小分类", required = true)
private String st;
@NotEmpty(message = "课程等级不能为空")
@ApiModelProperty(value = "课程等级", required = true)
private String grade;
@ApiModelProperty(value = "教学模式(普通,录播,直播等)", required = true)
private String teachmode;
@ApiModelProperty(value = "课程介绍")
private String description;
@ApiModelProperty(value = "课程图片", required = true)
private String pic;
@NotEmpty(message = "收费规则不能为空")
@ApiModelProperty(value = "收费规则,对应数据字典", required = true)
private String charge;
@ApiModelProperty(value = "价格")
private BigDecimal price;
}
3.注解解释
4.随后在controller接收参数的时候加上个@Validated
@ApiOperation("新增课程基础信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Update.class}) AddCourseDto addCourseDto){
return courseBaseInfoService.addCourse(1L,addCourseDto);
}
三、分组使用
因为我们不同的业务,可能需要不同的校验规则,所以我们需要使用分组校验
1.我们定义不同的接口类型(空接口)表示不同的分组
/**
* @description 校验分组
*/
public class ValidationGroups {
//插入数据的校验分组
public interface Insert{};
//更新数据的校验分组
public interface Update{};
//删除数据的校验分组
public interface Delete{};
}
2.在类中的属性添加注解属性的时候需要指明分组的名字
@NotEmpty(groups = {ValidationGroups.Insert.class},message = "添加课程名称不能为空")
@NotEmpty(groups = {ValidationGroups.Update.class},message = "修改课程名称不能为空")
// @NotEmpty(message = "课程名称不能为空")
@ApiModelProperty(value = "课程名称", required = true)
private String name;
3.在Controller方法中启动校验规则指定要使用的分组名
@ApiOperation("新增课程基础信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Insert.class}) AddCourseDto addCourseDto){
//机构id,由于认证系统没有上线暂时硬编码
Long companyId = 1L;
return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}
再次测试,由于这里指定了Insert分组,所以抛出 异常信息:添加课程名称不能为空。
如果修改分组为ValidationGroups.Update.class,异常信息为:修改课程名称不能为空。
注意:
若在Controller方法中启动校验规则指定要使用的分组名,那只能对带有这个分组名的校验注解的属性进行校验
本文参考于黑马程序员的学成在线课程的资料