Spring框架bean校验JSR303学习随笔
JSR303规范参数校验
在controller接口开启校验功能@Valid
效果:校验错误以后会有默认响应;
给校验的bean后缀紧跟一个BindResult,就可以获取到校验的结果
如图:
运行结果:
自定义校验规则
使用@Pattern注解自定义校验规则
使用自定义注解
1). 编写一个自定义的注解
package com.foncen.common.valid; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; /** * Created by IntelliJ IDEA. * Author: Foncen * Date: 2020/6/28 */ @Documented @Constraint( validatedBy = {ListValuesConstraintValidator.class}//关联注解校验器 ) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) public @interface ListValues { /** * jsr303 自定义注解三要素 * 1.message 消息错误提示,根据给定的值从配置文件提取指定的消息 * 2.group 指定分组策略 * 3.payload 关联注解校验器 */ String message() default "{javax.validation.constraints.ListValues.message}";//指定获取信息键 Class<?>[] groups() default {};//指定分组 Class<? extends Payload>[] payload() default {}; //关联注解校验器 int[] values() default {};//自定义注解 }
2).编写一个自定义的校验器
package com.foncen.common.valid; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Created by IntelliJ IDEA. * Author: Foncen * Date: 2020/6/28 */ public class ListValuesConstraintValidator implements ConstraintValidator<ListValues,Integer> { private Set<Integer> set = new HashSet<>(); @Override /** * 注解初始化赋值 */ public void initialize(ListValues constraintAnnotation) { int[] values = constraintAnnotation.values(); if (values != null && values.length > 0) { Arrays.stream(values).forEach(item -> set.add(item)); } } @Override /** * 校验器校验逻辑实现 * true 校验通过 * false 校验失败 */ public boolean isValid(Integer value, ConstraintValidatorContext context) { return this.set.contains(value); } }
3).关联自定义的注解和校验器
@Constraint( validatedBy = {ListValuesConstraintValidator.class}//关联注解校验器 )
4).配置校验不通过消息
source目录下新建==ValidationMessages.properties== 文件,文件内容:
javax.validation.constraints.ListValues.message=必须提交指定值
5).实体类使用注解
/** * 显示状态[0-不显示;1-显示] */ @ListValues(values={0,1},groups = {AddGroup.class,UpdateGroup.class} ) private Integer showStatus;
启动服务,postman测试结果:
jsr303分组校验
给校验注解标注在什么情况下需要进行校验
@RequestMapping("/update") // @RequiresPermissions("product:brand:update") public R update(@Validated({UpdateGroup.class}) @RequestBody BrandEntity brand){ brandService.updateById(brand); return R.ok(); }
选择分组策略:
/** * 显示状态[0-不显示;1-显示] */ @ListValues(values={0,1},groups = {AddGroup.class,UpdateGroup.class} ) private Integer showStatus;
总结:
匆匆忙忙,笔记随简,记录一下jsr303的使用,加深印象,重在参考jsr303规范实现原理.