自定义注解编写以及讲解(以异常处理为例)
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 = 传入值出错
以上是关于自定义注解编写以及讲解(以异常处理为例)的主要内容,如果未能解决你的问题,请参考以下文章
Feign自定义配置和编写Feign的Spring boot 插件
编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常