Java 如何在禁用MongoDB但仍然安装的情况下运行Spring?

Java 如何在禁用MongoDB但仍然安装的情况下运行Spring?,java,spring,mongodb,spring-boot,spring-data,Java,Spring,Mongodb,Spring Boot,Spring Data,我正在阅读这期Git: 关于JavaSpring启动,我正在试图找到一种方法来绕过启动时的崩溃 简短的版本是,如果包含用于创建mongo客户端的代码: @Bean public MongoOperations mongoOperations() { try { //This runs an operation which uses my credentials to login to the db return new MongoTemplate(mong

我正在阅读这期Git: 关于JavaSpring启动,我正在试图找到一种方法来绕过启动时的崩溃

简短的版本是,如果包含用于创建mongo客户端的代码:

@Bean
public MongoOperations mongoOperations() {
    try {
        //This runs an operation which uses my credentials to login to the db
        return new MongoTemplate(mongoDbFactory());
    } catch (Exception e){
        e.printStackTrace();
        return null;
    }
}
并且MongoDB正在运行,它将连接并且没有任何问题,但是如果MongoDB没有运行,Spring将重试,再次失败后,将崩溃并停止所有启动序列


我的问题是:除了注释掉引用DB的所有代码外,还有没有其他方法可以绕过DB启动和运行时的初始崩溃/检查?我是否可以在底层捕获异常并让其通过?

如果您的应用程序的行为方式是MongoDB是可选的,那么您有几个选项

如果要迁移现有的应用程序,从一开始最简单的方法就是自己创建基础结构。从
@Bean
方法返回
null
的方式并不令人讨厌。相反,您可以使用一些可以延迟创建客户机的服务,并且您可以更新MongoDB的可选用法以通过该服务。服务将被创建,但仅在必要时创建底层基础设施


另一个选项是使用配置文件。如果主要用例是MongoDB可用,那么创建一个
应用程序nomongo.properties
(类似的内容),您可以使用
spring.autoconfigure.exclude
属性排除自动配置。当应用程序在没有mongo的情况下启动时,您可以启用
nomongo
配置文件,自动配置将退出。未启用时,Spring Boot将创建
Mongo
bean。

我也遇到了同样的问题。我希望我的应用程序也能够脱机运行,排队,并不时刷新到数据库。这意味着它需要能够离线启动,并在互联网可用时连接。Ofc,Spring在连接失败时使我的应用程序崩溃。 对我有效的是:

@Configuration
@EnableJpaRepositories(bootstrapMode = BootstrapMode.LAZY)
public class DataSourceConfig {

@Bean(destroyMethod = "close")
public DataSource dataSource() {
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setDriverClassName("xxx");
    hikariConfig.setJdbcUrl("xxx");
    hikariConfig.setUsername("xxx");
    hikariConfig.setPassword("xxx");

    hikariConfig.setConnectionTestQuery("SELECT 1");
    hikariConfig.setPoolName("springHikariCP");
    hikariConfig.setInitializationFailTimeout(-1);

    hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
    hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
    hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
    hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
    HikariDataSource dataSource = new HikariDataSource(hikariConfig);

    return dataSource;
}

@Bean
public EntityManager entityManager() {
    return entityManagerFactory().getObject().createEntityManager();
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan("blabla");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.setJpaProperties(additionalProperties());
    return em;
}

private Properties additionalProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL55Dialect");

    return properties;
}
}
此外,请将其放在应用程序类中

@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)
application.yml如下所示:

#Spring properties
spring:
  jpa:
    hibernate:
      ddl-auto: update
  datasource:
    url: "xxx"
    username: xxx
    password: xxx
    driver-class-name: com.mysql.cj.jdbc.Driver
    continue-on-error: true
  hikari:
    connection-timeout: 2000
    initialization-fail-timeout: -1
    auto-commit: true

这对我来说很有效,希望它也能对你们有用,我在这里看到很多帖子都在寻找解决方案。祝你好运

如果应用程序从启动时就使用数据库(或在启动时进行初始数据加载),它怎么能忽略数据库已关闭的事实呢?您可以尝试惰性地初始化Springbeans:在这种情况下,如果在运行时不使用mongoDb,则根本不会调用上面的代码。