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

Posted linchenguang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义注解编写以及讲解(以异常处理为例)相关的知识,希望对你有一定的参考价值。

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的值
     */
    @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 = 传入值出错

以上是关于自定义注解编写以及讲解(以异常处理为例)的主要内容,如果未能解决你的问题,请参考以下文章

java 自定义事件的触发及监听

Feign自定义配置和编写Feign的Spring boot 插件

创建自定义注解来处理异常

编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常

SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...

Spring boot异常统一处理方法:@ControllerAdvice注解的使用全局异常捕获自定义异常捕获