为什么不能在存储库中自动装配 AuditReader

Why AuditReader can't be Autowired in the Repository

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

@Repository
public class RevisionRepository {

private AuditReader auditReader;

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

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

启动 ApplicationContext 时出错。要显示条件报告,请重新 运行 您的应用程序并启用 'debug'。 2020-12-24 21:09:15 -


应用程序启动失败


描述:

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

操作:

考虑在您的配置中定义类型为 'org.hibernate.envers.AuditReader' 的 bean。

我怎样才能使这个工作?

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

@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());
  }
}

接受的答案对我不起作用,因为一段时间后应用程序 运行,由于连接关闭,它开始抛出 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();
        ...
    }