自定义注释以根据枚举类型验证字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义注释以根据枚举类型验证字符串相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个自定义注释,以验证针对特定StringEnum。我正在使用Hibernate Validator API。所需的用例如下所示。

@MessageTypeOf(MessageType.NETWORK)
private String message;

String应该根据enum论证给出的枚举的toString()方法给出的值进行验证(在本例中为MessageType.NETWORK)。

我写了一个验证器,看起来像这样。

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);
    }
}

以上是关于自定义注释以根据枚举类型验证字符串的主要内容,如果未能解决你的问题,请参考以下文章

想必大家在做参数验证的时候,都会遇到一个问题,就是如何验证枚举? 自定义annotation 自定义Validator

将字符串数组转换为WHERE子句中的自定义枚举类型

针对枚举验证JSON字段

VSCode创建自定义用户片段

vs code 自定义代码片段

ASP.NET MVC:通过 DataAnnotation 进行自定义验证