当前端表单传过来较多数据时,我们后端可以采用JSR303校验校验,避免使用大量的if else来校验
一、使用说明
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.将前端传过来的表单数据用一个dto对象接收,并且在对象需要做校验属性上加上@NotEmpty、@Size注解等
@Data
@ApiModel(value="AddCourseDto", description="新增课程基本信息")
public class AddCourseDto {
//@NotEmpty(message = "课程名称不能为空")
@NotEmpty(groups = ValidationGroups.Inster.class,message = "新增课程名称不能为空")
@NotEmpty(groups = ValidationGroups.Update.class,message = "修改课程名称不能为空")
@ApiModelProperty(value = "课程名称", required = true)
private String name;
@NotEmpty(message = "适用人群不能为空")
@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 = "课程介绍")
@Size(message = "课程介绍内容太少",min = 10)
private String description;
3.在controller方法参数上开启校验,也就是加上@Validated注解
@ApiOperation("课程新增接口")
@PostMapping("/course")
public CourseBaseInfoVo createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){
//机构id,由于认证系统没有上线暂时硬编码
Long companyId = 1232141425L;
return courseBaseService.createCourseBase(companyId,addCourseDto);
}
4.我们还需要自定义异常来将这些错误信息返回给前端(如果某个属性为空,就会报MethodArgumentNotValidException错误)
/**
*todo 因为我们使用了JSR303来进行表单数据校验,所以要定义这个异常,来返回对应的错误信息
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse MethodArgumentNotValidException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
//拿到这些错误信息
List<String> list = new ArrayList<>();
bindingResult.getFieldErrors()
.stream()
.forEach(
item -> list.add(item.getDefaultMessage())
);
//将集合里面的错误信息拼接起来
String msg = StringUtils.join(list, ",");
log.error("【系统异常】{}",msg);
return new RestErrorResponse(msg);
}
5.当这个dto类被多个接口用来接收参数使用时,我们可以设置组
①创建一个类,添加各种组(接口)
/**
* @description 校验分组
* @author Mr.Su
* @date
* @version 1.0
*/
public class ValidationGroups {
public interface Inster{};
public interface Update{};
public interface Delete{};
}
②在属性上设置不同组对应不同信息
//@NotEmpty(message = "课程名称不能为空")
@NotEmpty(groups = ValidationGroups.Inster.class,message = "新增课程名称不能为空")
@NotEmpty(groups = ValidationGroups.Update.class,message = "修改课程名称不能为空")
@ApiModelProperty(value = "课程名称", required = true)
private String name;
③在不同接口上定义对应的组(比如新增我就定义组为insert,修改就定义组为update)
@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto
6.相关注解