验证UUID Restful服务

时间:2018-12-20 12:17:12

标签: java regex spring spring-boot annotations

我有一个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

2 个答案:

答案 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(...)