如何为Spring的@PropertySource批注传递命令行参数?

时间:2019-12-05 04:52:41

标签: java spring spring-boot maven

说明:

作为测试开发人员,我想在执行测试之前选择一个特定的属性文件。

问题:

如何在命令行中调用所需的属性?

我正在使用mvn来构建我的项目。

想法:

我在想类似的东西:

~mvn clean verify -Dproperty.source.project1=QA1 -Dproperty.source.project2=QA2

最好在命令行中处理多个属性选择(如上面的行),因为该项目将有多个"propertycontrollers"

代码:

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"));
    }
}

application-QA1.properties

sample.url = https://hello.com

application-QA2.properties

sample.url = https://world.com

更新: 也欢迎其他解决方案。洗耳恭听。 谢谢

2 个答案:

答案 0 :(得分:0)

自从您为文件application-${env}.properties命名以来,您应该只使用Spring Boot的内置“配置文件”功能。

请参见Spring Boot Reference Documentation,第Spring Boot Feature节,第2. Externalized Configuration章,其中列出:

  
      
  1. Profile-specific application properties在打包的jar(application-{profile}.properties和YAML变体)之外。

  2.   
  3. Profile-specific application properties包装在jar中(application-{profile}.properties和YAML变体)

  4.   

还有第3. Profiles章,上面写着(释义)

  

您可以使用以下开关在命令行上指定配置文件:

     

--spring.profiles.active=QA1

阅读上面链接的两章的文档,以了解有关此强大功能的更多信息。

答案 1 :(得分:0)

或者,您可以如下设置属性的默认值。

@Value("${some.key:stackoverflow.com}")
private String url;

在上面的示例stackoverflow.com中,如果未提供任何内容,则网址将有效。