Java validation指定值验证自定义注解

"该博客介绍了如何在Java中创建一个名为`EnumValue`的自定义注解,用于验证字段或参数是否为预定义的枚举值。注解支持对String和Int类型的参数进行验证,并提供了对应的`EnumValueValidator`实现类进行逻辑校验。示例展示了注解的使用方式,如在字段上添加`@EnumValue(stringValue={"yourValue"}
摘要由CSDN通过智能技术生成
EnumValue.java // 自定义注解
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.RetentionPolicy.RUNTIME;


@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValueValidator.class})
public @interface EnumValue {

    String message() default "";

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

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

    // 用来验证String类型参数
    String[] stringValue() default {};

    // 用来验证Int类型参数
    int[] intValue() default {};

    @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        EnumValue[] value();
    }
}
EnumValueValidator.java // 自定义注解实现
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;

public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {

    private String[] strValues;
    private int[] intValues;

    @Override
    public void initialize(EnumValue constraintAnnotation) {
        strValues = constraintAnnotation.stringValue();
        intValues = constraintAnnotation.intValue();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) return true;

        if (!(value instanceof String) && !(value instanceof Integer)) return true;

        if (strValues != null && strValues.length > 0 && value instanceof String) {
            return Arrays.asList(strValues).contains(value);
        }

        if (intValues != null && intValues.length > 0 && value instanceof Integer) {
            return Arrays.stream(intValues).anyMatch(v -> v == (int) value);
        }

        return false;
    }
}

用法:

@EnumValue(stringValue = {"yourValue"})
private String type;

 

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义注解来实现List<String>的正则表达式Hibernate验证。下面是一个简单的示例: ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = RegexListValidator.class) @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface RegexList { String message() default "list elements do not match the regex"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String value(); } ``` 在上述示例中,我们使用了Hibernate Validator提供的注解 `@Constraint` 和 `@Documented`,并指定了注解的验证器 `RegexListValidator`。该注解包含一个属性 `value`,用于指定正则表达式。在 `RegexListValidator` 类中,我们实现了注解的验证逻辑。 下面是 `RegexListValidator` 类的示例代码: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.List; public class RegexListValidator implements ConstraintValidator<RegexList, List<String>> { private String regex; @Override public void initialize(RegexList constraintAnnotation) { this.regex = constraintAnnotation.value(); } @Override public boolean isValid(List<String> value, ConstraintValidatorContext context) { if (value == null) { return true; } for (String str : value) { if (!str.matches(regex)) { return false; } } return true; } } ``` 在 `RegexListValidator` 类中,我们实现了 `ConstraintValidator<RegexList, List<String>>` 接口,并重写了其中的 `isValid` 方法,该方法用于实现注解的验证逻辑。在 `isValid` 方法中,我们首先判断传入的 List 是否为 null,如果是,则返回 true,表示验证通过;否则,对 List 中的每个元素进行正则表达式验证。 使用时,我们只需要在需要进行List<String>类型字段的正则表达式验证的实体类中,使用 `@RegexList` 注解标记该字段,例如: ```java public class MyClass { @RegexList("\\d+") private List<String> list; } ``` 在需要进行验证的时候,只需要调用 `validate` 方法即可,例如: ```java ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); MyClass obj = new MyClass(); obj.list = Arrays.asList("123", "456", "789"); Set<ConstraintViolation<MyClass>> violations = validator.validate(obj); System.out.println(violations.isEmpty()); // 输出:true,因为所有的字符串都是数字 ``` 在上述示例中,我们使用了 Hibernate Validator 提供的 `Validator` 接口来进行验证。如果验证通过,`validate` 方法将返回一个空的 `Set`,否则,该 `Set` 将包含所有的验证错误信息。 希望这个示例可以帮助您解决问题。如果您还有其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值