Java 如何传递Spring';s@PropertySource注释?
说明: 作为测试开发人员,我希望在执行测试之前选择一个特定的属性文件 问题: 如何在命令行中调用所需的属性 我正在使用Java 如何传递Spring';s@PropertySource注释?,java,spring,spring-boot,maven,Java,Spring,Spring Boot,Maven,说明: 作为测试开发人员,我希望在执行测试之前选择一个特定的属性文件 问题: 如何在命令行中调用所需的属性 我正在使用mvn构建我的项目 创意: 我在想这样的事情: ~mvn clean verify-Dproperty.source.project1=QA1-Dproperty.source.project2=QA2 最好在命令行中处理多个属性选择(如上面的行),因为此项目将有多个“PropertyController” 代码: package com.core.propertycontrol
mvn
构建我的项目
创意:
我在想这样的事情:
~mvn clean verify-Dproperty.source.project1=QA1-Dproperty.source.project2=QA2
最好在命令行中处理多个属性选择(如上面的行),因为此项目将有多个“PropertyController”
代码:
package com.core.propertycontroller;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@PropertySource("classpath:application-${env}.properties")
//This project will have Project2PropertyLoader.class, and so on and so forth.
public class Project1PropertyLoader {
public Project1PropertyLoader() { super();}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
我正在使用@ContextConfiguration
加载这个类
package com.testrunners;
import com.core.propertycontroller.Project1PropertyLoader;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Project1PropertyLoader.class } , loader = AnnotationConfigContextLoader.class)
public class EnvironmentTest {
@Autowired
private Environment environment;
@Value("${sample.url}")
private String url;
@Test
public void printUrl() {
System.out.println("Project1PropertyLoader Url via @Value " + url);
System.out.println("Project1PropertyLoader Url via Environment " + environment.getProperty("sample.url"));
}
}
应用程序-QA1.1属性
sample.url=https://hello.com
应用程序-QA2.2属性
sample.url=https://world.com
更新:
也欢迎其他解决办法。我洗耳恭听。
谢谢既然您将文件命名为
application-${env}.properties
,您应该只使用Spring Boot的内置“profile”功能
请参阅第节第章,其中列出:
application-{profile}.properties
和YAML变体)
application-{profile}.properties
和YAML变体)
--spring.profiles.active=QA1
阅读上面链接的两章的文档,了解有关此强大功能的更多信息。或者,您可以如下设置属性的默认值
@Value("${some.key:stackoverflow.com}")
private String url;
在上面的示例中,如果没有提供url,stackoverflow.com将是有效的。编译器在编译时评估RetentionPolicy.RUNTIME注释的注释元数据,因此无法在运行时动态更改。您可以使用“令牌”模板并将文件另存为.template,根据mvn命令,生成一个具有正确注释属性值的java文件,然后编译它。您可以使用spring评测,并在SpringBootTest类中放置注释“@ActiveProfiles”“通过指定所需的环境,例如dev、qa或test.profile依赖于
应用程序.properties
文件,这将假定您只有1
项目1
属性类加载器。不或者,即使在同时调用多个环境的情况下,这也能起作用吗?@GheenoSanPascualIII不,配置文件完全独立于属性。它们是相关的,因为Spring Boot将尝试使用所示的命名约定加载特定于概要文件的属性文件。但是概要文件也可以通过使用注释来控制SpringBean是否可用属性和配置文件都由SpringApplicationContext
管理,因此不限于1
Project1
属性类加载器。