spring JSR303参数校验

本文介绍了Spring框架中使用JSR303进行bean校验的方法,包括给字段添加校验注解、自定义校验规则、分组校验策略等,并展示了如何处理校验结果及自定义错误消息。
摘要由CSDN通过智能技术生成

Spring框架bean校验JSR303学习随笔


JSR303规范参数校验

  1. 给目标bean需要校验的字段添加校验注解:javax.validation.costraints,并定义自己的message提示

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFwQOw4R-1593279255567)(G:\FoncenNote\note\spring\springImg\char.PNG)]


  1. controller接口开启校验功能@Valid

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cao7pUSN-1593279255569)(G:\FoncenNote\note\spring\springImg\jieguo.PNG)]


    效果:校验错误以后会有默认响应;


  2. 给校验的bean后缀紧跟一个BindResult,就可以获取到校验的结果

    如图:

    在这里插入图片描述


    运行结果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsoBxrzk-1593279255572)(G:\FoncenNote\note\spring\springImg\result.PNG)]
  3. 自定义校验规则

    使用@Pattern注解自定义校验规则

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ts5oR5Xs-1593279255573)(G:\FoncenNote\note\spring\springImg\char.PNG)]


    使用自定义注解

    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测试结果:



    1. 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规范实现原理.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值