• 自定义注解编写以及讲解(以异常处理为例)


    1,@Constraint注解

    说到自定义验证类型的注解,那就要说说@Constraint这个官方注解了,我们既然自定义了注解,那么注解的逻辑在哪里处理呢?没错,就是这个@Constraint帮我们处理。

    message则是定义错误提示,其取值路径一般是校验注解的全类名,会在配置文间种取出{}中配置的消息,本例是在配置文件中取出com.atguigu.common.valid.ListValue.message配置的消息。

    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;
    @Documented @Constraint(validatedBy = { ListValueConstraintValidataor.class }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) public @interface ListValue { String message() default "{com.atguigu.common.valid.ListValue.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] vals() default { }; }

    2、@Constraint注解逻辑处理方法

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.util.HashSet;
    import java.util.Set;
    
    //ConstraintValidator<>注解种填写两个泛型,一个是自定义注解,一个是指标注在什么类型上
    public class ListValueConstraintValidataor implements ConstraintValidator<ListValue, Integer> {
    
        private Set<Integer> set = new HashSet<>();
    
        /*
         *初始化方法
         *将注解内的值例如:@ListValue(vals = {0,1})种0,1放入set中
         */
        @Override
        public void initialize(ListValue constraintAnnotation) {
    
            int[] vals = constraintAnnotation.vals();
    
            for (int val : vals) {
                set.add(val);
            }
        }
    
        /*
         * 判断是否校验成功
         * value是需要校验的值,本例中是Integer showStatus的值,若有则返回true,无返回flase
         */
        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
            return set.contains(value);
        }
    }

    3、需要校验的对象

    import com.atguigu.common.valid.AddGroup;
    import com.atguigu.common.valid.ListValue;
    import com.atguigu.common.valid.UpadteGroup;
    import com.atguigu.common.valid.UpadteStatusGroup;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.Data;
    import org.hibernate.validator.constraints.URL;
    
    import javax.validation.constraints.*;
    
    /**
     * 品牌
     * 
     * @author chenshun
     * @email linchenguang@gmail.com
     * @date 2020-05-19 20:39:16
     */
    @Data
    @TableName("pms_brand")
    public class BrandEntity implements Serializable {
        private static final long serialVersionUID = 1L;
    
        /**
         * 品牌id
         */
        @NotNull(message = "修改必须指定品牌id",groups = {UpadteGroup.class})
        @Null(message = "新增必须指定品牌id",groups = {AddGroup.class})
        @TableId
        private Long brandId;
        /**
         * 品牌名
         */
        @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpadteGroup.class})
        private String name;
        /**
         * 品牌logo地址,新增时不能为空并且符合URL地址格式,而修改时可以为空但必须符合URL地址
         */
        @NotBlank(groups = {AddGroup.class})
        @URL(message = "必须上传正确图片",groups = {AddGroup.class,UpadteGroup.class})
        private String logo;
        /**
         * 介绍
         */
        private String descript;
        /**
         * 显示状态[0-不显示;1-显示]
         */
        @NotNull(groups = {AddGroup.class, UpadteStatusGroup.class})
        @ListValue(vals = {0,1},groups = {AddGroup.class, UpadteStatusGroup.class})
        private Integer showStatus;
        /**
         * 检索首字母
         */
        @NotEmpty(groups = {AddGroup.class})
        @Pattern(regexp = "^[a-zA-Z]$",message = "范围必须在a-z或A-Z之间",groups = {AddGroup.class,UpadteGroup.class})
        private String firstLetter;
        /**
         * 排序
         */
        @NotNull(groups = {AddGroup.class})
        @Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpadteGroup.class})
        private Integer sort;
    
    }

    4、ValidationMessages.properties:

    com.atguigu.common.valid.ListValue.message = 传入值出错
  • 相关阅读:
    UI: Form editor && use CRectTracker to allow user drag/move/resize graphics
    如何设置共享文件夹
    log4net每天生成一个log文件
    自动属性/匿名方法/Lamda表达式
    ASPOSE.CELL
    转载:动态调用WebService(C#)
    按钮Button动态事件的名称
    ASPOE.WORD
    操作MSSQL服务还有测试是否连接
    操作MSSQL服务还有测试是否连接1
  • 原文地址:https://www.cnblogs.com/linchenguang/p/13075490.html
Copyright © 2020-2023  润新知