项目A的application.yml未加载到依赖于A的项目B中

时间:2015-12-03 02:07:34

标签: spring spring-boot

我有两个弹簧启动项目A和B.项目A是一个内置于jar中的公共库;项目B是一个打包成战争的Web服务。项目B依赖于pom.xml中的A.

在项目A中:

@SpringBootApplication
@PropertySource("classpath:application.yml")
@ComponentScan({ "com.a" })
public class AppA {

}

@Configuration
@ConfigurationProperties(prefix="a")
@Data
public class AConfig {
    private String attr1;  //in application.yml under project A's classpath
}

在项目A中,通过了以下测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppA.class)
public class SDTTokenServiceTest {
    @Autowired
    private AConfig aConfig;

    @Test
    public void testAConfig () {
        Assert.assertNotNull(aConfig.getAtrr1());
    }
}

在项目B中:

@SpringBootApplication
@Import(AppA.class)
@PropertySource("classpath:application.yml")
@ComponentScan({ "com.b" })
public class AppB {

}

在项目B中,由于null属性,以下测试失败。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppB.class)
public class SDTTokenServiceTest {
    @Autowired
    private AConfig aConfig;

    @Test
    public void testAConfig () {
        Assert.assertNotNull(aConfig.getAtrr1());
    }
}

为什么项目B无法获取A中的属性?我怎样才能解决这个问题?谢谢!

更新: 两个yaml文件都在它们的类路径下,可能在项目B中导入项目A时会产生冲突。在我将项目A中的yaml文件移动到另一个路径classpath:config/application.yml之后,它可以正常工作。

有谁知道在这种情况下如何加载yaml文件?当它们都在自己的类路径下时为什么它不起作用?谢谢!

1 个答案:

答案 0 :(得分:0)

您应该在AppA注释中添加位置,而不是使用@PropertySource注释@ConfigurationProperties

@Configuration
@ConfigurationProperties(prefix="a", location={"classpath:application.yml"})
@Data
public class AConfig {
    private String attr1;  //in application.yml under project A's classpath
}

@Import注释用于导入@Configuration,而不是@SpringBootApplication

  

表示要导入的一个或多个{@link Configuration @Configuration}类。

@SpringBootApplication
@Import(AConfig.class)
@PropertySource("classpath:application.yml")
@ComponentScan({ "com.b" })
public class AppB {

}