当前位置: 首页 > 知识库问答 >
问题:

Autowired存储库在自定义约束验证器中为空

祝嘉懿
2023-03-14

我有一个基于Spring的WebApp。我在控制器中使用了几个带有注释@repository和@transactional的存储库类。那部分工作得很好。

我创建了一个自定义约束验证器,它必须访问存储库。现在我不明白为什么存储库是空的。我尝试用@component注释来注释验证器。包含所有这些类的基本包位于XML部分。那么,我还应该做些什么来确保存储库依赖项注入的工作。这就是我的约束验证器的样子。

public class DonorTypeExistsConstraintValidator implements
    ConstraintValidator<DonorTypeExists, DonorType> {

  @Autowired
  private DonorTypeRepository donorTypeRepository;

  @Override
  public void initialize(DonorTypeExists constraint) {

  }

  public boolean isValid(DonorType target, ConstraintValidatorContext context) {

   System.out.println("donorType: " + target);
   if (target == null)
     return true;

   try {
    if (donorTypeRepository.isDonorTypeValid(target.getDonorType()))
     return true;
   } catch (Exception e) {
    e.printStackTrace();
   }
   return false;
  }

  public void setDonorRepository(DonorTypeRepository donorTypeRepository) {
    this.donorTypeRepository = donorTypeRepository;
  }
}
<context:annotation-config />

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

<context:component-scan base-package="controller" />
<context:component-scan base-package="repository" />
<context:component-scan base-package="model" />
<context:component-scan base-package="viewmodel" />

更新

更令人费解的是,删除所有预插入监听器(在本例中只有BeanValidationEventListener)可以修复autowiring问题。这使事情变得更加复杂。

我甚至没有像下面的答案所描述的那样插入BeanValidationEventListener。这实际上与这里的建议相反:JSR-303依赖注入和Hibernate

  @Override
  public void integrate(Configuration configuration, SessionFactoryImplementor implementor,
                        SessionFactoryServiceRegistry registry) {
      logger.info("Registering event listeners");
      System.out.println("here");
      // you can add duplication strategory for duplicate registrations

      final EventListenerRegistry eventRegistry = registry.getService(EventListenerRegistry.class);
      // prepend to register before or append to register after
      // this example will register a persist event listener

      eventRegistry.prependListeners(EventType.PERSIST, EntitySaveListener.class);
      eventRegistry.appendListeners(EventType.MERGE, EntitySaveListener.class);
      Iterator<PreInsertEventListener> iter = eventRegistry.getEventListenerGroup(EventType.PRE_INSERT).listeners().iterator();
      while (iter.hasNext()) {
        PreInsertEventListener el = iter.next();
        System.out.println(el.getClass());
        BeanValidationEventListener listener = (BeanValidationEventListener) el;
        System.out.println(listener);
        iter.remove();
      }
  }

这里提供的xml配置文件https://github.com/c4g/v2v/blob/87dc266043f6d623c101d947a88fa0b0ad536355/war/web-inf/v2v-servlet.xml

希望实际的代码能帮助您回答我的问题。谢了!

共有1个答案

段阳夏
2023-03-14

您正在使用哪个ValidatorFactory。或者换一种说法,引导Bean验证对您来说很热?每个缺省Bean验证(以及Hibernate Validator作为引用植入)不向ConstraintValidator实例中注入依赖项。至少在Bean验证1.0中是这样。

要启用依赖项注入,必须配置自定义ConstraintValidatorFactory。Spring提供了SpringConstraintValidatorFactoryBean,这是使用LocalValidatorFactoryBean时的默认设置-请参见http://static.springsource.org/Spring/docs/3.0.0.rc3/reference/html/ch05s07.html

另外,您是否在使用JPA?我假设是这样,在这种情况下,生命周期事件自动验证。您可以使用属性javax.persistence.validation.mode并将其设置为none而不是试图删除事件侦听器。我想知道在基于生命周期的验证中是否使用了正确的验证器。

这完全取决于您的整个Spring配置和使用。

 类似资料:
  • 问题内容: 我有一个基于Spring的webapp。我在控制器中使用了几个带有注解@ Repository,@ Transactional的存储库类。那部分工作正常。 我创建了一个自定义约束验证器,它必须访问存储库。现在,我不明白为什么存储库为空。我尝试使用@Component注释对验证器进行注释。包含所有这些类的基本程序包位于xml的一部分中。因此,我还应该采取其他措施来确保存储库依赖项注入正常

  • 我对Spring是完全陌生的,对于所问的问题,我已经在SO上寻找了一些答案。以下是链接: Spring 3.1 Autowiring不能在自定义约束验证器中工作 它采用了Spring的验证器实现,而不是Hibernate的验证器。我不知道如何准确地注入Hibernate验证器,并简单地在其他类之间自动调用它,所以我使用了一个廉价的技巧,现在我的Java配置如下所示 (如果有人能告诉我如何避免以这种

  • 问题内容: 我对Spring完全陌生,因此已经针对所问问题在SO上找到了一些答案。这里是链接: 我有一个Spring项目,我想在其中使用Hibernate Validator进行对象验证。根据我在网上阅读的内容和一些论坛,我尝试注入验证器,如下所示: 但是无论我在哪里使用 它采用了Spring的验证器实现,而不是Hibernate的验证器。我不知道如何准确地注入Hibernate验证程序,并简单地

  • 我已经搜索并找到了很多关于这个问题的话题,但无论出于什么原因,解决方案都不能解决我的问题。 我运行的是Spring boot 1.5.8和Hibernate。 我创建了一个自定义验证注释,以检查电子邮件与数据库相比是否唯一。注释使用查询数据库,以检查数据库中是否已存在电子邮件。我一直得到一个异常,bean为空。 我的理论是使用了hibernate验证器,而不是< code > UniqueEmai

  • 问题内容: 我有一个基于Spring的webapp。我在控制器中使用了几个带有注解@ Repository,@ Transactional的存储库类。那部分工作正常。 我创建了一个自定义约束验证器,它必须访问存储库。现在,我不明白为什么存储库为空。我尝试使用@Component注释对验证器进行注释。包含所有这些类的基本程序包位于xml的一部分中。因此,我还应该采取其他措施来确保存储库依赖项注入正常

  • 我在项目中使用bean验证,我想为现有的约束注释编写一个自定义验证器。 例如,我有一个类,它表示一个名为CustomDateTime的日期/时间。在使用此类作为例如出生日期的类中,我想用过去的日期对字段进行注释: 然后,我通过实现ConstraintValidator创建一个自定义验证器 我知道您通常会创建这样的单独注释: 但对我来说,这似乎是双重代码;-) 如何注册要与一起使用的自定义验证器?