【问题标题】:Why AuditReader can't be Autowired in the Repository为什么 AuditReader 不能在存储库中自动装配
【发布时间】:2021-04-03 03:40:50
【问题描述】:

在我的 springbootapp 中,我有以下存储库:-

@Repository
public class RevisionRepository {

private AuditReader auditReader;

public RevisionRepository(AuditReader auditReader) {
    this.auditReader = auditReader;
  }
}

当我运行这个应用程序时。我收到了这个错误:-

启动 ApplicationContext 时出错。要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。 2020-12-24 21:09:15 -


应用程序启动失败


说明:

com.howtodoinjava.demo.repository.RevisionRepository 中构造函数的参数 0 需要一个无法找到的 'org.hibernate.envers.AuditReader' 类型的 bean。

行动:

考虑在您的配置中定义一个“org.hibernate.envers.AuditReader”类型的 bean。

我怎样才能做到这一点?

【问题讨论】:

  • 把@Autowired放在私有的AuditReader auditReader上;
  • 您应该手动创建 AuditReader bean。见例子here
  • @kmplzz 感谢您的建议。它解决了我的问题。

标签: java spring-boot hibernate-envers


【解决方案1】:

这解决了我的问题。希望它对其他人有所帮助:-

@Configuration
public class RevisionConfiguration {

@Autowired
private AuditReader auditReader;

private final EntityManagerFactory entityManagerFactory;

public RevisionConfiguration(EntityManagerFactory entityManagerFactory) {
    this.entityManagerFactory = entityManagerFactory;
}

@Bean
AuditReader auditReader() {
    return AuditReaderFactory.get(entityManagerFactory.createEntityManager());
  }
}

【讨论】:

【解决方案2】:

接受的答案对我不起作用,因为在应用程序运行一段时间后,由于连接关闭,它开始抛出 java.net.SocketException。

我通过以下方式解决了这个问题:

  1. 使用@PersistenceContext 连接EntityManager

  2. 每次获取一个新的 AuditReader 实例

    public class AuditRepository {
    
    @PersistenceContext
    private EntityManager entityManager;
    
    private AuditReader getAuditReader() {
        return AuditReaderFactory.get(entityManager);
    }
    
    public Optional<T> getRevision() {
        final AuditReader auditReader = getAuditReader();
        ...
    }
    

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2014-04-22
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多