2023-04-08 JSR303校验

当前端表单传过来较多数据时,我们后端可以采用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.相关注解


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容