验证 UUID Restful 服务

Abr*_*sis 6 java regex validation spring spring-boot

我有一个 RESTful 服务,它接收POST带有UUID值的请求并将它们写入数据库。所以问题是验证是否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 {};
}
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因它不起作用,即使我通过了有效的UUID我也经常得到一个例外:

javax.validation.UnexpectedTypeException: HV000030: 找不到约束“javax.validation.constraints.Pattern”验证类型“java.util.UUID”的验证器

是否有任何选项可以UUID正确验证?

Nik*_*las 6

您不能将@Pattern注释应用于java.util.UUID不是CharSequence. 从@Pattern注释文档(强调我的):

接受CharSequence。null 元素被认为是有效的。

此外,据我所知,您尝试通过将验证注释处理程序传递给新的注释定义来扩展验证注释处理程序的行为。

如果您希望执行更复杂的验证,只需在没有其他验证注释的情况下创建您的注释 - 它们的组合不会像这样工作。必须有一些东西可以识别注释并验证它们。

@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = UuidValidator.class)
public @interface ValidUuid {

    String message() default "{invalid.uuid}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

现在,创建一个验证器,它实现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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并应用注释:

@ValidUuid
private UUID uuId;
Run Code Online (Sandbox Code Playgroud)

  • @NikolasCharalambidis 除非您将 `@Constraint(validatedBy = UuidValidator.class)` 添加到 ValidUuid 接口,否则它不起作用 (2认同)