微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个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);
        }
    }
}

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。