自定义注释以根据枚举类型验证字符串
Custom annotation to validate string against enum type
我正在尝试编写一个自定义注释,以根据特定 Enum
验证 String
。我正在使用 Hibernate Validator API
。所需的用例如下所示。
@MessageTypeOf(MessageType.NETWORK)
private String message;
String
应该根据作为枚举参数给出的枚举的 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);
}
}
我正在尝试编写一个自定义注释,以根据特定 Enum
验证 String
。我正在使用 Hibernate Validator API
。所需的用例如下所示。
@MessageTypeOf(MessageType.NETWORK)
private String message;
String
应该根据作为枚举参数给出的枚举的 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);
}
}