@UUID休眠验证器不会在应用程序启动时进行验证

@UUID hibernate validator doesn't validate on application start

提问人:dja 提问时间:10/16/2023 最后编辑:dja 更新时间:10/17/2023 访问量:66

问:

我尝试使用 Spring 对 UUID 进行验证。

当我直接在配置类中使用 Pattern 时,如代码所示,并在 yaml 中键入错误的 UUID,它会在应用程序启动时在验证时正确打印错误:

@Validated
@Configuration
@Getter
@Setter
@ConfigurationProperties
public class ClientConfig {

    @Pattern(regexp = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")
    @Nonnull
    private String clientId;

}

如果我使用此处提供的答案并将模式提取到自实现@interface中,它也可以工作。但是,如果我尝试使用休眠中的注释,那么切换到这个:

    @org.hibernate.validator.constraints.UUID
    @Nonnull
    private String clientId;

然后,我的应用程序不再验证 yaml 中的属性,并且不会在启动时触发任何错误。

冬眠我错过了什么?我是否需要注册一些额外的注释处理器才能使其工作以及如何工作?

我对@interfaces有点陌生,我也不明白如何轻松找到接口后面的实现类。

Java Spring 验证

评论

1赞 Deltharis 10/16/2023
@ 接口没有实现,它们只是标记。然而,它们被用于其他类中 - 对于验证者来说,这是一个验证者类 - docs.jboss.org/hibernate/stable/validator/api/org/hibernate/...是这里感兴趣的类之一。您可以尝试在那里进行调试以检查它是否被调用(无论是在启动时还是在运行时更改属性时,只是为了查看它的行为方式)
0赞 dja 10/17/2023
感谢您的澄清。所以我发现我可以“搜索用法”来找到合适的 Validator 类。

答:

0赞 dja 10/17/2023 #1

我发现了以下几点:

使用 jdk11

我在 IDE 中没有遇到编译错误,我可以启动应用程序,并且它不会在 UUIDValidator 内的任何位置停止。但是,如果我尝试运行mvn install,则会出现以下错误:

[ERROR]     package m365.graph.client;
[ERROR]     ^
[ERROR] The type jakarta.validation.Payload cannot be resolved. It is indirectly referenced from required .class files

这不是配置类本身,而是使用配置的类。

使用 jdk17

由于我们无论如何都想迁移到 17,所以我完成了升级并在这里尝试了一下,因为我知道您不能再在那里使用 javax.annotation。在这种情况下,一切都按预期工作。它正确地停在 UUIDValidator 中的 initilize 断点处,并且在配置中验证了错误的 UUID,从而引发错误。

但是,有人知道为什么我仅在运行 mvn 时使用 jdk11 时才遇到这个令人困惑的错误吗?