gpt4 book ai didi

java - @Valid 和自定义验证注释 - 何时进行验证?

转载 作者:行者123 更新时间:2023-11-30 08:49:28 24 4
gpt4 key购买 nike

我开发了应用程序,发现了一些我无法理解的东西。我创建了名为@UsernameAvailable 的自定义验证注释和 ConstraintValidator 的实现。

我用注解对实体的某些字段进行注解,并添加了一些 System.out.println("something message");在 ConstraintValidator isValid() 方法中。

我注意到验证方法被调用了两次:

首先当页面上的表单被提交并且数据被绑定(bind)到实体时。然后,第二次当实体被 JpaRepository(来自 Spring Data JPA)保存时

但不同之处在于,在我的 ConstraintValidator 实现中,我有一些 @Autowired 依赖项,当第一次对“表单提交验证”进行验证时,依赖项被正确注入(inject)。

第二次,在保存实体时调用 isValid 方法时,我的@Autowired 服务为空,这是为什么呢?

如果您不明白,请阅读并观看:

我写的所有内容都显示在这个视频中:https://www.youtube.com/watch?v=rFf0CaxaHVc (最好从04:20分开始看)

这正是我遇到的问题,为什么我必须检查 isValid 中的空值?为什么服务为空?

理解这一点对我来说非常重要

最佳答案

我在 Java EE (JSF/CDI/EJB/JPA) 应用程序中遇到了同样的问题。我认为这里发生的事情是完全一样的。

您有两个不同的容器,在此处执行验证。从提交表单的地方(在我的例子中是 CDI 托管 bean),以及当 JPA 在持久化之前创建和调用 validator 时从 ejb 内部。

对于表单验证,容器创建一个支持注入(inject)的 validator 。但是,在表单验证之后,实体将被提交给 ejb 服务(在您的情况下可能有所不同),该服务又调用 JPA/EntityManager 进行持久化等。JPA 在持久化之前有一个验证步骤,但不会创建这样的 validator (具有 CDI 功能),以便任何注入(inject)尝试都会失败,如您所见。 JPA 规范中没有要求在验证步骤中支持注入(inject),我已经使用 eclipseLink 和 Hibernate 进行了测试。

将有多个选项可以解决这个问题——但似乎没有一个选项像让 JPA 支持具有 CDI 功能的自定义 validator 那样优雅——至少在你的场景中是这样。因此,为了这个答案的目的,我可以确认您观察到的行为目前是出于给定原因指定/设计的。我在这里遇到了同样的问题EJB injection fails in custom ConstraintValidator on JPA persist .

关于java - @Valid 和自定义验证注释 - 何时进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com