我有一个RESTful服务,该服务接收带有POST
值的UUID
请求并将其写入DB。因此,问题在于验证UUID
是否有效。为此,我实现了自定义注释:
@Constraint(validatedBy = {})
@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Pattern(regexp = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}")
public @interface validUuid {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
但是由于某些原因,即使我通过了有效的UUID
,它仍然无法工作:
javax.validation.UnexpectedTypeException:HV000030:没有验证器 可以找到约束'javax.validation.constraints.Pattern' 验证类型'java.util.UUID'
是否有任何选项可以正确验证UUID
?
答案 0 :(得分:2)
您不能将@Pattern
注释应用于不是java.util.UUID
的某物(CharSequence
)。从@Pattern
注释文档中(强调我的观点):
接受 CharSequence 。空元素被视为有效。
此外,据我所知,您尝试通过将验证注释处理程序传递给新的注释定义来扩展其行为。
如果您想执行更复杂的验证,只需创建您的注释而无需另一个验证注释-它们的组合就不能这样工作。必须有某物来识别注释并对其进行验证。
@Target({ElementType.FIELD})
@Retention(RUNTIME)
public @interface ValidUuid {
String message() default "{invalid.uuid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
现在,创建一个实现ConstraintValidator<ValidUuid, UUID>
的验证器,并覆盖执行验证本身的方法。
public class UuidValidator implements ConstraintValidator<ValidUuid, UUID> {
private final String regex = "....." // the regex
@Override
public void initialize(ValidUuid validUuid) { }
@Override
public boolean isValid(UUID uuid, ConstraintValidatorContext cxt) {
return uuid.toString().matches(this.regex);
}
}
并应用注释:
@ValidUuid
private UUID uuId;
答案 1 :(得分:0)
您可以使用BarProcessor
;赶上UUID.fromString(...)