自定义注解完成校验枚举类型的三种方法。

注解在实体类的字段上,要确定这个字段是什么类型。

有三种类型:

1、校验枚举类–自定义的各种Enum类型

2、校验枚举值–Integer类型

3、校验枚举名称–String类型

使用枚举涉及到前后端数据库类型转换的问题,相比之下,Integer和String使用简单。

校验枚举类–自定义的各种Enum类型

校验单一枚举类

仅仅作用于单个枚举类。

通过注解的实现类中,可以看到,该注解仅仅作用于Enum<GenderEnum>枚举类。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {GenderValidator.class})
public @interface GenderValid {

	String message() default "Invalid GenderEnum type,请输入正确的枚举类型";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};
    
    Class<?> target() default Class.class;

}

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

/**
 * @author jjsai
 * @date 2021/7/12 15:33
 **/
public class GenderValidator implements ConstraintValidator<GenderValid, Enum<GenderEnum>> {

	@Override
	public void initialize(GenderValid constraintAnnotation) {
	}

	@Override
	public boolean isValid(Enum<GenderEnum> value, ConstraintValidatorContext context) {
		if (value instanceof GenderEnum) {
			return true;
		}
		return false;
	}

}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import java.util.stream.Stream;

/**
 * @author jjsai
 * @date 2021/7/12 15:32
 **/
public enum GenderEnum {

	MALE(1,"男性"),

	FEMALE(2,"女性"),

	MONSTERS(3,"妖怪");

	private Integer code;

	private String desc;

	GenderEnum(Integer code,String desc) {
		this.code = code;
		this.desc = desc;
	}

	@JsonValue
	public Integer getCode() {
		return code;
	}

	public String getDesc() {
		return desc;
	}

	@JsonCreator
	public static GenderEnum getGender(Integer code) {
		if (code == null) {
			return null;
		}
		GenderEnum[] values = GenderEnum.values();
		return Stream.of(values).filter(it -> it.getCode().equals(code)).findAny().orElse(null);
	}

}
@EnumValid
private GenderEnum gender;

校验各种枚举类

任何枚举类上都可以使用,需要传入参数target,指定哪个枚举类型。

通过注解的实现类中,可以看到,该注解作用于Object类,任何枚举类都可以来这里校验。

import javax.validation.ConstraintValidatorContext;

/**
 * @author jjsai
 * @date 2021/7/12 11:43
 **/
@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {

	private EnumValid annotation;

	@Override
	public void initialize(EnumValid constraintAnnotation) {
		annotation = constraintAnnotation;
	}

	@Override
	public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
		Class<?> cls = annotation.target();
		Object[] objects = cls.getEnumConstants();
		for (Object obj : objects) {
			if (obj.equals(value)) {
				return true;
			}
		}
		return false;
	}
}
@EnumValid(target = GenderEnum.class)
private GenderEnum gender;

@EnumValid(target = TypeEnum.class)
private TypeEnum type;

校验枚举值–Integer类型

通过注解的实现类中,可以看到,该注解作用于Integer类。

import lombok.extern.slf4j.Slf4j;

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

/**
 * @author jjsai
 * @date 2021/7/12 11:43
 **/
@Slf4j
public class EnumValidatorInteger implements ConstraintValidator<EnumValid, Integer> {

	private EnumValid annotation;

	@Override
	public void initialize(EnumValid constraintAnnotation) {

		annotation = constraintAnnotation;
	}

	@Override
	public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
		boolean result = false;

		// 获取注解时传的target参数
		Class<?> cls = annotation.target();


		if (cls.isEnum() && value != null ) {

			// 获取这个枚举类中的枚举列表
			Object[] objects = cls.getEnumConstants();
			try {

				for (Object obj : objects) {

					// obj to Enum 
                    // 这种方法些许潦草,可以使用反射,在下边
					String s = JacksonUtils.obj2json(obj);
					GenderEnum genderEnum = JacksonUtils.json2pojo(s, GenderEnum.class);

					// 注解的字段值与枚举实例的code进行比较,一致 则校验通过
					if (value.equals(genderEnum.getCode())) {
						result = true;
						break;
					}
				}
			} catch (Exception e) {
				result = false;
			}
		}
		return result;
	}

}
import lombok.extern.slf4j.Slf4j;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Method;

/**
 * @author jjsai
 * @date 2021/7/12 11:43
 **/
@Slf4j
public class EnumValidatorInteger implements ConstraintValidator<EnumValid, Integer> {

	private EnumValid annotation;

	@Override
	public void initialize(EnumValid constraintAnnotation) {

		annotation = constraintAnnotation;
	}

	@Override
	public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
		boolean result = false;

		// 获取注解时传的target参数
		Class<?> cls = annotation.target();

		if (cls.isEnum() && value != null ) {

			// 获取这个枚举类中的枚举列表
			Object[] objects = cls.getEnumConstants();
			try {
				// 获取枚举类中的getCode方法对象
				Method method = cls.getMethod("getCode");
				for (Object obj : objects) {

					// obj对象反射调用getCode方法
					Object code = method.invoke(obj);

					// 注解的字段值与枚举实例的code进行比较,一致 则校验通过
					if (value.equals(code)) {
						result = true;
						break;
					}
				}
			} catch (Exception e) {
				result = false;
			}
		}
		return result;
	}

}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import java.util.stream.Stream;

/**
 * @author jjsai
 * @date 2021/7/12 15:32
 **/
public enum GenderEnum {

	MALE(1,"男性"),

	FEMALE(2,"女性"),

	MONSTERS(3,"妖怪");

	private Integer code;

	private String desc;

	GenderEnum(Integer code,String desc) {
		this.code = code;
		this.desc = desc;
	}

	@JsonValue
	public Integer getCode() {
		return code;
	}

	public String getDesc() {
		return desc;
	}

	@JsonCreator
	public static GenderEnum getGender(Integer code) {
		if (code == null) {
			return null;
		}
		GenderEnum[] values = GenderEnum.values();
		return Stream.of(values).filter(it -> it.getCode().equals(code)).findAny().orElse(null);
	}

}

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author jjsai
 * @date 2021/7/11 19:05
 **/
@Data
@NoArgsConstructor
public class Student {

	private Long id;

	private String userName;

	private String telphone;

	@EnumValid(target = GenderEnum.class)
	private Integer gender;

}

校验枚举名称–String类型

通过注解的实现类中,可以看到,该注解作用于String类。

import lombok.extern.slf4j.Slf4j;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author jjsai
 * @date 2021/7/12 11:43
 **/
@Slf4j
public class EnumValidatorString implements ConstraintValidator<EnumValid, String> {

	private EnumValid annotation;

	@Override
	public void initialize(EnumValid constraintAnnotation) {

		annotation = constraintAnnotation;
	}

	@Override
	public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
		boolean result = false;
		Class<?> cls = annotation.target();
		if (cls.isEnum() && (value != null && value.trim().length() != 0)) {
			Object[] objects = cls.getEnumConstants();
			try {
				Method method = cls.getMethod("name");
				for (Object obj : objects) {
					Object code = method.invoke(obj);
					if (value.equals(code.toString())) {
						result = true;
						break;
					}
				}
			} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
				result = false;
			}
		}
		return result;
	}
}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import java.util.stream.Stream;

/**
 * @author jjsai
 * @date 2021/7/12 15:32
 **/
public enum GenderEnumString {

	MALE(1, "男性"),

	FEMALE(2, "女性"),

	MONSTERS(3, "妖怪");

	private Integer code;

	private String desc;

	GenderEnumString(Integer code, String desc) {
		this.code = code;
		this.desc = desc;
	}

	public String getDesc() {
		return desc;
	}

	@JsonValue
	public Integer getCode() {
		return code;
	}

	@JsonCreator
	public static GenderEnumString getGender(String desc) {
		if (desc == null) {
			return null;
		}
		GenderEnumString[] values = GenderEnumString.values();
		return Stream.of(values).filter(it -> it.getDesc().equals(desc)).findAny().orElse(null);
	}

}
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author jjsai
 * @date 2021/7/11 19:05
 **/
@Data
@NoArgsConstructor
public class Student {

	private Long id;

	private String userName;

	private String telphone;

	@EnumValid(target = GenderEnumString.class)
	private String gender;

}
Java中,可以使用自定义注解校验LocalDateTime类型的数据。下面是一个示例: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.time.LocalDateTime; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface DateTimeValidation { String message() default "Invalid DateTime format"; String pattern() default "yyyy-MM-dd HH:mm:ss"; boolean allowNull() default false; } public class MyClass { @DateTimeValidation(pattern = "yyyy-MM-dd") private LocalDateTime date; // 其他成员变量和方法... } ``` 在上面的示例中,我们定义了一个名为`DateTimeValidation`的自定义注解。该注解可以应用于类的字段上,并且可以指定校验的格式、是否允许为空等属性。 在使用时,可以通过反射获取字段上的注解,并根据注解的属性进行相应的校验逻辑。例如,可以编写一个校验方法来检查字段的值是否符合指定的日期时间格式: ```java import java.lang.reflect.Field; import java.time.format.DateTimeFormatter; public class Validator { public static void validate(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(DateTimeValidation.class)) { field.setAccessible(true); Object value = field.get(obj); if (value != null) { DateTimeValidation annotation = field.getAnnotation(DateTimeValidation.class); String pattern = annotation.pattern(); boolean allowNull = annotation.allowNull(); if (value instanceof LocalDateTime) { LocalDateTime dateTime = (LocalDateTime) value; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); try { formatter.format(dateTime); } catch (Exception e) { throw new IllegalArgumentException(annotation.message()); } } else { throw new IllegalArgumentException("Field is not of type LocalDateTime"); } } else if (!allowNull) { throw new IllegalArgumentException("Field cannot be null"); } } } } } ``` 上述代码中的`Validator`类提供了一个静态方法`validate`,用于校验对象中带有`DateTimeValidation`注解的字段。校验逻辑包括检查字段值是否为`LocalDateTime`类型、是否符合指定的日期时间格式以及是否允许为空。 使用示例: ```java public class Main { public static void main(String[] args) { MyClass obj = new MyClass(); obj.setDate(LocalDateTime.now()); try { Validator.validate(obj); System.out.println("Validation passed"); } catch (IllegalAccessException e) { e.printStackTrace(); } } } ``` 以上就是使用自定义注解校验LocalDateTime类型数据的一个简单示例。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值