自定义Validation注解验证枚举值

不说了,上代码

定义注解

package com.xxx.common.validate;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import com.xxx.common.validate.In.List;

import com.xxx.common.validate.validator.InValidator;

@Documented
@Constraint(validatedBy = {InValidator.class})
@Target({ METHOD, FIELD, PARAMETER })
@Retention(RUNTIME)
@Repeatable(List.class)
public @interface In {

	String message();//所有validation注解必须的方法

	Class<?>[] groups() default { };//所有validation注解必须的方法

	Class<? extends Payload>[] payload() default { };//所有validation注解必须的方法
	
	String[] value();
	
	@Target({ METHOD, FIELD, PARAMETER })
	@Retention(RUNTIME)
	@Documented
	public @interface List {
		In[] value();
	}
}

定义注解处理类

package com.xxx.common.validate.validator;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.apache.commons.lang3.StringUtils;

import com.xxx.common.dto.ServiceException;
import com.xxx.common.validate.In;

import lombok.extern.slf4j.Slf4j;

@Slf4j//lombok注解
public class InValidator implements ConstraintValidator<In, Comparable<?>> {
	
	private List<String> list;
	
	@Override
	public void initialize(In constraintAnnotation) {
		String[] values = constraintAnnotation.value();
		for (String value : values) {
			if (StringUtils.isBlank(value)) {
				//一个自定义的运行时异常类
				throw new ServiceException("@In中任何元素不能包含blank值");
			}
		}
		this.list = Arrays.asList(values);
	}

	@Override
	public boolean isValid(Comparable<?> value, ConstraintValidatorContext context) {
		if (value == null) {
			return true;
		}
		List<String> list = this.list;
		if (list.isEmpty()) {
			return false;
		}
		try {
			//数值类型的值用compareTo比较可以避免一些格式上的bug
			if (value instanceof BigDecimal) {
				BigDecimal bigDecimal = (BigDecimal) value;
				for (String el : list) {
					if (bigDecimal.compareTo(new BigDecimal(el)) == 0) {
						return true;
					}
				}
			} else if (value instanceof BigInteger) {
				BigInteger bigInteger = (BigInteger) value;
				for (String el : list) {
					if (bigInteger.compareTo(new BigInteger(el)) == 0) {
						return true;
					}
				}
			} else if (value instanceof Integer) {
				Integer integer = (Integer) value;
				for (String el : list) {
					if (integer.compareTo(Integer.valueOf(el)) == 0) {
						return true;
					}
				}
			} else if (value instanceof Long) {
				Long longer = (Long) value;
				for (String el : list) {
					if (longer.compareTo(Long.valueOf(el)) == 0) {
						return true;
					}
				}
			} else if (value instanceof Short) {
				Short shorter = (Short) value;
				for (String el : list) {
					if (shorter.compareTo(Short.valueOf(el)) == 0) {
						return true;
					}
				}
			} else if (value instanceof Byte) {
				Byte byter = (Byte) value;
				for (String el : list) {
					if (byter.compareTo(Byte.valueOf(el)) == 0) {
						return true;
					}
				}
			} else {
				if (list.contains(value.toString())) {
					return true;
				}
			}
			
		} catch (NumberFormatException e) {
			log.error(list.toString() + "元素转数字异常", e);
		}
		return false;
	}

}

用法

/**
 * groups 根据需要可省略或修改,Save.class是自定义的一个空接口,用来标识分组
 * value 必填,字符串数组
 * message 必填,验证不通过时的提示信息,{value}是spring的spel表达式,表示引用value的值
 * 可标注在BigDecimal、BigInteger、Integer、Long、Short、Byte、Charactor、String及其原始类型上,它们都是Comparable类型;也可以标注在其它Comparable类型上,验证时调用其toString方法比较
 */
@In(groups = {Save.class}, value = {"00", "01", "02"}, message = "值必须是{value}之一")

结语

如有错误或不足之处,欢迎指正

回答: 在Spring Validation中,你可以使用自定义注解来定义校验规则。在引用中的代码中,我们可以看到`@BankNo`注解的定义。这个注解标识了一个银行账号的校验规则。通过`validatedBy`属性指定了具体的校验逻辑的实现类`BankNoValidator`。同时,`groups`和`payload`属性可以用于对校验进行分类和负载。在引用中的代码中,我们可以看到在接口或方法中使用`@Validated`注解来启用校验功能。在例子中,`OrderDTO`对象上使用了`@Validated`注解,表示要对这个对象进行校验。而在引用中的代码中,我们可以看到`EqualsXzhValidator`类实现了`ConstraintValidator<EqualsXzh, String>`接口,其中`EqualsXzh`注解自定义注解,用于校验字符串必须是"xzh"。自定义校验规则的实现逻辑写在`isValid`方法中,根据具体的业务需求来编写校验规则。这样,在使用`@Validated`注解进行校验时,就会自动触发对应的校验规则。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring自定义注解(validation)](https://blog.csdn.net/ileopard/article/details/123485111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于Spring Validation自定义校验注解](https://blog.csdn.net/Anenan/article/details/128004111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值