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

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

周麒
2023-03-14

我有一个Spring应用程序试图连接到数据库。为了进行连接,必须首先建立SSH隧道(使用Jsch)。如何将HibernateJPAAutoConfiguration延迟到建立Jsch SSH会话的bean返回之后?目前应用程序无法启动,因为隧道尚未打开。当我试图排除这个autoconfiguration类,然后在已经创建的会话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);
        }
    }
}

共有1个答案

卢永寿
2023-03-14

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

请参考以下内容:Spring Data JPA与ssh隧道连接到远程MySQL服务器

 类似资料:
  • 安装Windows服务时,有两个选项可以在Windows启动时自动启动Windows服务。一个是自动,另一个是自动(延迟启动)。详细来说,这两者有什么区别? 例如,如果您使用wixtoolset创建安装程序,ServiceConfig元素具有DelayedAutoStart属性。当服务在启动时启动时,这会对发生的事情产生什么影响? WiX留档:ServiceConfig元素

  • 我想将来自AWS Kinesis流的消息的处理延迟一个小时。我已将KCL消费者配置为每四分钟读取一批记录,检查每条记录的时间戳,如果任何记录不到一个小时,则停止处理该批次,无需检查点。我希望同一个消费者实例每四分钟重读一次相同的消息,直到整个批次足够旧可以处理,然后检查点消费者。但是,在实践中,消费者只读取一次消息,这意味着它们被忽略,并且在准备好处理时永远不会再次读取。有没有办法将消费者配置为每

  • 问题内容: 我刚开始用Java编写代码,我正努力设置DelayQueue, 我想这样 我只是想学习所有的基础知识,并且从api上学到了内容,似乎无法掌握它。 提前致谢 问题答案: 该直到一定的延时已经过期保持要素内部。元素必须实现接口。 例如,我创建了一个扩展Delayed接口的类。这将实现compareTo和getDelay()方法 结果:

  • 问题内容: 我正在使用angularjs,并且希望能够在需要时加载指令,而不是在页面开始时加载所有指令。我正在尝试为最常用的插件创建指令。 这样,一个direct可以在最终编译html之前用于加载所有需要的指令。 如果该指令与其他指令一起在页面开始加载,则一切正常。但是,如果稍后加载“子”指令(在“父”中),则该指令无效。以下是“ parent”指令的compile字段中pre字段的代码。 使用y

  • 问题内容: 我正在尝试用Java做某事,而我需要一些东西在while循环中等待/延迟几秒钟。 我想构建一个步进音序器,并且对Java还是陌生的。有什么建议么? 问题答案: If you want to pause then use java.util.concurrent.TimeUnit: TimeUnit.SECONDS.sleep(1); TimeUnit.MINUTES.sleep(1);

  • 问题内容: 我想在更改背景之间的命令之间设置延迟。我尝试使用线程计时器,并尝试使用运行和捕获。但这不起作用。我试过了 但这只是变成黑色。 问题答案: 试试这个代码: