我有两个弹簧启动项目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文件?当它们都在自己的类路径下时为什么它不起作用?谢谢!
答案 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 {
}