【发布时间】: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 配置运行。
标签: java spring spring-boot spring-data-jpa ssh-tunnel