美文网首页
JRS303校验的使用

JRS303校验的使用

作者: 惠惠雨辰 | 来源:发表于2021-01-21 22:52 被阅读0次

    要引入maven依赖

    <dependency>

    <groupId>javax.validation</groupId>

    <artifactId>validation-api</artifactId>

    <version>2.0.1.Final</version>

    </dependency>

    1.给bean中添加校验注解javax.validation.constraints,并指定message

    package com.yuchen.yuchenmail.mailproduct.entity;

    import com.baomidou.mybatisplus.annotation.TableId;

    import com.baomidou.mybatisplus.annotation.TableName;

    import java.io.Serializable;

    import java.util.Date;

    import com.yuchen.common.valid.AddGroup;

    import com.yuchen.common.valid.ListValue;

    import com.yuchen.common.valid.UpdateGroup;

    import lombok.Data;

    import org.hibernate.validator.constraints.URL;

    import javax.validation.constraints.*;

    /**

    * 品牌

    *

    * @author yuchen

    * @email ${email}

    * @date 2020-12-20 14:49:50

    */

    @Data

    @TableName("pms_brand")

    public class BrandEntity implements Serializable {

    private static final long serialVersionUID =1L;

    /**

        * 品牌id

    */

      @NotNull(message ="修改的时候品牌Id不能为空", groups = {UpdateGroup.class})

    @TableId

      @Null(message ="新增不能指定品牌的ID", groups = {AddGroup.class})

    private Long brandId;

    /**

        * 品牌名

        */

      @NotNull(message ="品牌名不能为空", groups = {AddGroup.class, UpdateGroup.class})

    private String name;

    /**

        * 品牌logo地址

        */

      @NotEmpty(groups = {AddGroup.class})

    @URL(message ="logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})

    private String logo;

    /**

        * 介绍

        */

      private String descript;

    /**

        * 显示状态[0-不显示;1-显示]

    */

      @ListValue(vals = {0,1},groups = {AddGroup.class})

    private Integer showStatus;

    /**

        * 检索首字母

        */

      @NotEmpty(groups = {AddGroup.class})

    @Pattern(regexp ="/^[a-zA-Z]$/", message ="检索首字母必须是一个英文字母", groups = {AddGroup.class, UpdateGroup.class})

    private String firstLetter;

    /**

        * 排序

        */

      @Min(value =0, message ="排序字段必须是一个正整数", groups = {AddGroup.class, UpdateGroup.class})

    private Integer sort;

    2.开启校验,在controller层,参数的前面加上@Vaild 注解,这就开启了校验的功能

    /**

      * 保存

      */

      @RequestMapping("/save")

    //@RequiresPermissions("mailproduct:brand:save")

      public R save(@Valid @RequestBody BrandEntity brand){

    brandService.save(brand);

    return R.ok();

    }

    3.这个校验,在参数后面加上BindingResult bindingResult 就能获取到被校验住的参数和message

      public R save(@Valid @RequestBody BrandEntity brand, BindingResult bindingResult)

    不过这里一般使用全局异常处理,这个会在全局异常处理中讲解

    4.分组校验,特别声明:如果在参数中指定了分组校验,那些没有指定分组校验的和不是该分组校验的参数都能进行校验

    首先定义分组校验接口,就是空的接口

    package com.yuchen.common.valid;

    public interface AddGroup {

    }

    package com.yuchen.common.valid;

    public interface UpdateGroup {

    }

    然后在bean中的校验注解上添加校验分组,上面的bean中有详细的案例

    @URL(message ="logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})

    最后在controller层,需要校验的参数前面加上@Validated(AddGroup.class)并指定校验分组

    @RequestMapping("/save")

    //@RequiresPermissions("mailproduct:brand:save")

      public R save(@Validated(AddGroup.class)@RequestBody BrandEntity brand){

    brandService.save(brand);

    return R.ok();

    }

    5.自定义校验注解

    创建校验注解(这个注解可以参考其他的注解)创建注解的时候要注意的事项,在代码中有注释

    @Constraint(validatedBy = { ListValueConstraintValidator.class }) 中指定校验器,这里可以指定多个校验器

    package com.yuchen.common.valid;

    import javax.validation.Constraint;

    import javax.validation.Payload;

    import java.lang.annotation.Documented;

    import java.lang.annotation.Retention;

    import java.lang.annotation.Target;

    import static java.lang.annotation.ElementType.*;

    import static java.lang.annotation.ElementType.TYPE_USE;

    import static java.lang.annotation.RetentionPolicy.RUNTIME;

    /**

    * 这里的校验器只能够校验参数类型行是Integer的参数,如果想要校验参数类型是其他的,需要再顶一个校验器,并在validatedBy = {}中加入另一个校验器

    */

    @Documented

    @Constraint(validatedBy = { ListValueConstraintValidator.class })

    @Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER,TYPE_USE })

    @Retention(RUNTIME)

    public @interface ListValue {

    String message()default "{com.yuchen.common.valid.ListValue.message}";

    Class[] groups()default { };

    Class[] payload()default { };

    int[] vals()default {};

    }

    编写指定默认message的properties文件,这里的文件名是固定的ValidationMessages.properties

    在校验注解中的String message()default "{com.yuchen.common.valid.ListValue.message}"; 这的message前面的一般都是注解的引用路径

    com.yuchen.common.valid.ListValue.message=必须提交指定的值

    编写校验类, 实现 ConstraintValidator<ListValue, Integer> 这里参数的说明在代码注解中

    initialize(ListValue constraintAnnotation) 方法进行初始化,能够获取到在bean中参数上注解的填写的值,

     isValid(Integer value, ConstraintValidatorContext context) 这个就是进行校验的方法了

    package com.yuchen.common.valid;

    import javax.validation.ConstraintValidator;

    import javax.validation.ConstraintValidatorContext;

    import java.util.HashSet;

    import java.util.Set;

    /**

    * ConstraintValidator中的两个泛型,一个是值得是校验注解ListValue,另一个是指定要校验的参数是什么类型的值Integer

    */

    public class ListValueConstraintValidator implements ConstraintValidator <ListValue, Integer> {

    Set set =new HashSet<>();

    /**

    *

        * @param value  就是要进行校验的值,代码中是指的private Integer showStatus;

        * @param context

        * @return

        */

        @Override

        public boolean isValid(Integer value, ConstraintValidatorContext context) {

    return  set.contains(value);

    }

    /**

    *constraintAnnotation 可以获取到bean中的参数上面填写的值

    **/

    @Override

        public void initialize(ListValue constraintAnnotation) {

    int[] vals = constraintAnnotation.vals();

    for (int val : vals){

    set.add(val);

    }

    }

    }

    最后在需要的bean中添加校验注解就可以了

      @ListValue(vals = {0,1},groups = {AddGroup.class})

    相关文章

      网友评论

          本文标题:JRS303校验的使用

          本文链接:https://www.haomeiwen.com/subject/rzkjzktx.html