Java 从错误的@Configuration文件加载Spring@PropertySource

Java 从错误的@Configuration文件加载Spring@PropertySource,java,spring,Java,Spring,我有两个配置文件。一个用于构建(AppConfig),一个用于测试(TestAppConfig) AppConfig: @Configuration @Import(HttpConfig.class) @EnableTransactionManagement @PropertySource(name = "props", value = { "file:app.properties" }) public class AppConfig { @Configuration @Import(Http

我有两个配置文件。一个用于构建(AppConfig),一个用于测试(TestAppConfig)

AppConfig:

@Configuration
@Import(HttpConfig.class)
@EnableTransactionManagement
@PropertySource(name = "props", value = { "file:app.properties" })
public class AppConfig {
@Configuration
@Import(HttpConfig.class)
@EnableJpaRepositories("repository")
@ComponentScan(basePackages = "package")
@EnableTransactionManagement
@PropertySource(name = "props", value = { "classpath:test_app.properties" })
public class TestAppConfig {

  public static final String DB_NAME = "testdb";

  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
        .addScript("import_test.sql").setName(DB_NAME).build();
  }

  @Bean
  public EntityManagerFactory entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(dataSource());
    factory.setPersistenceUnitName(DB_NAME);
    factory.setPackagesToScan("domain");
    factory.setJpaVendorAdapter(jpaAdapter());
    factory.afterPropertiesSet();

    return factory.getObject();
  }

  @Bean
  public JpaVendorAdapter jpaAdapter() {
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.HSQL);

    return adapter;
  }

  @Bean
  public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory());
  }

  @Bean
  public HibernateExceptionTranslator exceptionTranslator() {
    return new HibernateExceptionTranslator();
  }

}
TestAppConfig:

@Configuration
@Import(HttpConfig.class)
@EnableTransactionManagement
@PropertySource(name = "props", value = { "file:app.properties" })
public class AppConfig {
@Configuration
@Import(HttpConfig.class)
@EnableJpaRepositories("repository")
@ComponentScan(basePackages = "package")
@EnableTransactionManagement
@PropertySource(name = "props", value = { "classpath:test_app.properties" })
public class TestAppConfig {

  public static final String DB_NAME = "testdb";

  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)
        .addScript("import_test.sql").setName(DB_NAME).build();
  }

  @Bean
  public EntityManagerFactory entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(dataSource());
    factory.setPersistenceUnitName(DB_NAME);
    factory.setPackagesToScan("domain");
    factory.setJpaVendorAdapter(jpaAdapter());
    factory.afterPropertiesSet();

    return factory.getObject();
  }

  @Bean
  public JpaVendorAdapter jpaAdapter() {
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.HSQL);

    return adapter;
  }

  @Bean
  public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory());
  }

  @Bean
  public HibernateExceptionTranslator exceptionTranslator() {
    return new HibernateExceptionTranslator();
  }

}
HttpConfig的完整性:

@Configuration
public class HttpConfig {
运行我的测试时,注释如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestAppConfig.class)
public class MyTest {
我得到一个错误:

Failed to load bean class: TestAppConfig; nested exception is java.io.FileNotFoundException: app.properties (No such file or directory)
为什么它试图拉app.properties?我已经指定它使用test_app.properties


如果我进行构建,它将使用正确的属性正确运行。

根据我们掌握的详细信息,我认为问题可能就在这里

@ComponentScan(basePackages = "package")
TestAppConfig
类中


如果您的
AppConfig
类位于该包中的某个位置,则执行组件扫描将为其创建一个bean(因为
@Configuration
),尝试加载它找不到的属性文件。对你的
@组件扫描
包要更加具体/专用。

你的
HttpConfig
有什么功能吗?没有,它只是用
@Configuration
注释并声明了一个bean。你必须在
TestAppConfig
中找到试图打开文件的东西。我建议你发布更多的上下文。或者尝试清理和重建。我已经添加了完整的TestAppConfig,但我认为它没有任何价值。哈哈,有些人可能不知道。谢谢,我想这可能就是答案。我将稍微修改一下我的包结构。