java - 用于根据枚举类型验证字符串的自定义注释

标签 java validation enums annotations hibernate-validator

我正在尝试编写一个自定义注释,用于根据特定的Enum 验证String。我正在使用 Hibernate Validator API。所需的用例如下所示。

@MessageTypeOf(MessageType.NETWORK)
private String message;

String 应根据作为枚举参数给出的枚举的 toString() 方法给出的值进行验证(在本例中为 MessageType.网络)。

我编写了一个 validator ,如下所示。

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> {

    private Set<String> values;

    @Override
    public void initialize(MessageTypeOf constraintAnnotation) {
        values = Arrays.asList(MessageType.values())
                .stream()
                .map(v -> v.toString())
                .collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null) return false;

        return values.contains(s);
    }
}

还有注释。

@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE })
@Retention(RUNTIME)
@Constraint(validatedBy = MessageTypeValidator.class)
@Documented
public @interface MessageTypeOf {

    String message() default "{org.hibernate.validator.referenceguide.chapter06.CheckCase." +
            "message}";

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

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

    MessageType value();

    @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        MessageType[] value();
    }
}

但是,这将验证字符串是否是枚举(任何值)的一部分,因为我需要针对特定​​字符串进行验证。有人可以建议如何做到这一点吗?

最佳答案

所以,基本上,该属性的唯一有效值是 MessageType.NETWORK.toString(),对吗?这很奇怪(期望客户端提供一个只能有一个有效值的字符串),但无论如何,您只需要检查一下:

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> {

    private String validValue;

    @Override
    public void initialize(MessageTypeOf constraintAnnotation) {
        this.validValue = constraintAnnotation.value().toString();
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return this.validValue.equals(s);
    }
}

关于java - 用于根据枚举类型验证字符串的自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877196/

相关文章:

java - 有没有欧洲国家和语言的java Enum?

javascript - 从实例中获取 TypeScript 枚举名称

java - JOOQ 和资源处理

javascript - 立即显示所有验证错误,并且在修复之前不允许提交

java - 素数错误

validation - Controller.ValidateModel 方法。它是如何工作的?

PHP 验证字符串字符是英国或美国键盘字符

java - 我应该测试枚举吗?

java - Android:同时从加速度计和陀螺仪获取数据

java - Spring Boot | JSONB Postgres |异常 : Unable to load class [jsonb]