如何延迟 Spring JPA 自动配置直到 bean 运行?

Posted

技术标签:

【中文标题】如何延迟 Spring JPA 自动配置直到 bean 运行?【英文标题】:How do I delay Spring JPA auto-configuration until a bean has run? 【发布时间】:2021-02-19 07:16:36 【问题描述】:

我有一个 Spring 应用程序正在尝试连接到数据库。为了连接,首先必须建立一个 SSH 隧道(使用 Jsch)。如何延迟 HibernateJpaAutoConfiguration 直到建立 Jsch SSH 会话的 bean 返回之后?目前应用程序无法启动,因为隧道尚未打开。当我尝试排除此自动配置类,然后根据已创建的会话 bean 显式实例化它时,我收到以下错误:

Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present!

我不明白为什么我突然必须自己提供这个,如果我依赖自动配置,我不必提供它。如果有人能告诉我实现这一目标的方法,那就太好了。

POM:

        ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring data JPA, default tomcat pool, exclude it -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        ...

主要应用:

@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)
public class Application 
    public static void main(String... args) 
        SpringApplication.run(Application.class, args);
    

    @Configuration
    static class SshTunnelConfiguration 
        @Bean
        public com.jcraft.jsch.Session sshTunnel() 
            ...
        
    

    @Configuration
    @ConditionalOnBean(com.jcraft.jsch.Session.class)
    static class DelayedJpaConfiguration extends HibernateJpaAutoConfiguration 
        public JpaConfiguration(DataSource dataSource, JpaProperties jpaProperties, ObjectProvider<JtaTransactionManager> jtaTransactionManager, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) 
            super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers);
        
    

【问题讨论】:

你试过用@AutoConfigureBefore添加你自己的自动配置吗? 因为你的DelayedJpaConfiguration 覆盖了默认的自动配置,有效地禁用了所有它,所以不再有自动配置。此外,您可能需要等待数据源而不是完整的 JPA 配置运行。 【参考方案1】:

您必须实现自己的数据源(通过扩展您使用的数据源)并实现 InitializingBean 接口,并在“afterPropertiesSet”方法中初始化您的 jsch 隧道。

请参考:Spring Data JPA with ssh tunnel to a remote mysql server

【讨论】:

以上是关于如何延迟 Spring JPA 自动配置直到 bean 运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何一次获取 100 条记录,直到使用 Spring JPA 的 oracle 中的所有记录?

Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作

Spring data jpa 不适用于自动配置的 entityManagerFactory

Spring boot JPA OneToOne 配置问题

Spring JPA 延迟加载 - 无法初始化代理

延迟加载 Spring Data JPA 存储库