gpt4 book ai didi

java - 应用程序无法加载application.yml文件

转载 作者:行者123 更新时间:2023-12-02 09:53:16 26 4
gpt4 key购买 nike

我正在编写junit测试用例,奇怪的事情发生了我有两个数据库

  • 1) 营销 Activity (应用级别) 2) 测试(测试级别)

我的应用程序结构是

    App
--> src/main/java
--> src/main/resource
application.yml

--> src/test/java
src/test/resource
application.yml

当我运行应用程序时,它加载src/main/resource application.yml文件并存储到内存中并指向campaign数据库工作正常。当我运行Junit测试用例时,应用程序再次加载src/main/resource application.yml,而不是加载src/test/resource application.yml

当我强制运行测试用例时,应用程序指向测试数据库当我停止服务器并再次运行应用程序时,它再次指向 test 数据库而不是 campaign 数据库。

application.yml(src/main/resources)或(src/test/resources)

spring:
profiles.active: local
aop.proxy-target-class: true

---
spring:
profiles: local

campaignDB:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/campaign
username: root
password: Admin@123

juintDB:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: Admin@123

测试级别配置

@RunWith(SpringRunner.class)
public class TestDbConfig {
@Autowired
private Environment env;

@Bean
@Profile("local")
public DataSource testDbdatasource() {
org.apache.tomcat.jdbc.pool.DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource();
datasource.setDriverClassName(env.getRequiredProperty("juintDB.driverClassName"));
datasource.setUrl(env.getRequiredProperty("juintDB.url"));
datasource.setUsername(env.getRequiredProperty("juintDB.username"));
datasource.setPassword(env.getRequiredProperty("juintDB.password"));
return datasource;
}
}

应用级配置

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(datasource());
emf.setJpaVendorAdapter(hibernateJpa);
emf.setPackagesToScan("com.brighttalk.campaign.model");

Map<String, String> jpaSchema = new HashMap<String, String>();
jpaSchema.put("hibernate.default_schema",
env.getRequiredProperty("hibernate.default_schema"));

jpaSchema.put("hibernate.dialect",
env.getRequiredProperty("hibernate.dialect"));
jpaSchema.put("hibernate.format_sql",
env.getRequiredProperty("hibernate.format_sql"));
jpaSchema.put("hibernate.hbm2ddl.auto",
env.getRequiredProperty("hibernate.hbm2ddl.auto"));
jpaSchema.put("hibernate.show_sql",
env.getRequiredProperty("hibernate.show_sql"));

emf.setJpaPropertyMap(Collections.singletonMap(
"javax.persistence.validation.mode", "none"));
emf.setJpaPropertyMap(jpaSchema);
return emf;
}

我期望当我测试用例时它应该指向测试数据库。当我运行应用程序时,它应该指向 Activity 数据库。

最佳答案

应用程序属性应位于主资源目录下,因此您遇到的行为是正常的。

要实现您想要做的事情,您需要创建一个配置文件特定的应用程序属性,方法是:

  1. 为每个配置文件创建一个单独的文件(例如,名为 test 的配置文件为 application-test.yml),并将其添加到同一目录中。
  2. 或者像上面那样在同一个 application.yml 文件中添加单独的配置文件特定属性。

然后,您需要使用 Activity 配置文件 test 运行集成测试,然后 Spring Boot 将获取特定于该配置文件的属性。

@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("test")
public class MyIntegrationTest {
....
}

如果您没有指定 Activity 配置文件,那么 Activity 配置文件将为default,这意味着 Spring Boot 将加载默认属性。

关于java - 应用程序无法加载application.yml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56165345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com