2

我是 SpringBoot 的新手。我已经构建了一个简单的应用程序,它应该在开发环境中使用假数据,并在测试环境中连接到 MongoDb。开发环境没有 mongodb 设置。

我尝试使用 Spring Boot 限定符/配置文件来实现它。

我有一个主类,如下所示:

@SpringBootApplication
public class Main {
   public static void main(String[] args) {
       SpringApplication.run(Main.class, args);
   }
}

我有一个 DAO 接口 StudentDao.java

public interface StudentDao {
    Student getStudentById(String id);
}

然后我为 DAO 创建了几个实现,一个用于伪造数据,一个用于来自 Mongo 的数据

FakeStudentDaoImpl.java

@Repository
@Qualifier("fakeData")
public class FakeStudentDaoImpl implements StudentDao {

    private static Map<String, Student> students;

    static {

        students = new HashMap<String, Student>(){
            {
                put("1", new Student("Ram", "Computer Science"));
            }
        };
    }

    @Override
    public Student getStudentById(String id){
        return this.students.get(id);
    }
}

MongoStudentDaoImpl.java

@Repository
@Qualifier("mongoData")
public class MongoStudentDaoImpl implements StudentDao {

    @Autowired
    private MongoStudentRepo repo;

    @Override
    public Student getStudentById(String id) {
        return  repo.findById(id).get();
    }
}

MongoStudentRepo 是一个扩展 MongoRepository 的简单接口:

public interface MongoStudentRepo extends MongoRepository<Student, String> {
}

我的 POM 文件有以下依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

当然,我还有其他控制器类。这在测试环境中运行良好,那里有一个 MongoDb,并且它能够连接到它。但是,当我尝试在本地环境中启动它时,它无法启动,因为它在启动时没有找到 MongoDb。

如何在本地环境中禁用 MongoDb 部分(并且只使用假数据)?我想让相同的代码在两种环境中工作。

提前致谢。

4

3 回答 3

1

您可以使用嵌入式 MongoDB 数据库。这里举个例子。

于 2019-05-03T01:47:07.767 回答
1

几种可能的选择:

1)您可以使用弹簧型材。将一个 bean 映射为@Profile("test),将第二个 bean 映射为@Profile("prod")。指定要使用的配置文件--spring.profiles.active=test

2)你可以有不同的配置

application-prod.yml
--------------
mongo-url:produrl

application-test.yml
--------------
mongo-url:localhost

使用弹簧活动配置文件来选择配置。要使用本地配置文件,您需要设置本地 mongo 实例。你可以再次有几个选择:只需下载 instancedocker imageembeded mongo

于 2019-05-03T01:56:02.970 回答
0

我遇到了同样的问题,并在另一个问题中找到了您要求的解决方案:

弹簧靴。如何有条件地禁用 JPA 的初始化

例如,如果您想在开发环境中禁用 spring-data-mongodb,那么,假设您在“dev”配置文件下运行:

application-dev.yml

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
于 2021-12-31T17:46:04.760 回答