在app.props中定义的活动配置文件,但是环境变量返回活动配置文件的空数组

时间:2019-05-24 13:52:27

标签: java spring-boot

我遇到的问题是:通过spring.profiles.active = development在application.properties中定义的活动配置文件。但是,当我将Spring的Environment变量用于getActiveProfiles()时,返回的只是一个空的String数组。该应用程序将启动“以下配置文件处于活动状态:开发”。感谢任何帮助。下面是一个简单的类,用于检查是否可以检索个人资料。

已经尝试自动装配环境变量,但无济于事。此类标记有@Component并实现EnvirontmentAware。

注意:关于此问题,我几乎查看了所有SO线程,因此请不要将其标记为重复项,因为没有一个解决了我的问题。

@Override
public void setEnvironment(Environment environment) {
    this.environment = environment;

    System.out.println(environment.getActiveProfiles()[0]);
}

当然,我们得到了索引超出范围的异常。

application.properties(由于敏感信息而省略了一些内容)

spring.profiles.active=development

主类:

@SpringBootApplication
@PropertySource("classpath:application.properties")
@ComponentScan("uk.co.demo*")
@Configuration
public class EbecsIntegrationAdapterApplication {

@Value("${activemq.broker_url}") private String amqBrokerUrl;
@Value("${activemq.username}") private String amqUsername;
@Value("${activemq.password}") private String amqPassword;
@Value("${server.ssl.key-store}") private String amqKeystore;
@Value("${server.ssl.key-store-password}") private String 
amqKeyStorePassword;


@Bean
public ConnectionFactory activemqConnectionFactory() throws Exception {
    ActiveMQSslConnectionFactory connectionFactory = new 
     ActiveMQSslConnectionFactory();
    connectionFactory.setBrokerURL(this.amqBrokerUrl + "? 
    jms.prefetchPolicy.all=1");
    connectionFactory.setUserName(this.amqUsername);
    connectionFactory.setPassword(this.amqPassword);
    connectionFactory.setTrustAllPackages(true);
    connectionFactory.setTrustStore(this.amqKeystore);
    connectionFactory.setTrustStorePassword(this.amqKeyStorePassword);
    connectionFactory.setKeyStore(this.amqKeystore);
    connectionFactory.setKeyStorePassword(this.amqKeyStorePassword);

    return new PooledConnectionFactory(connectionFactory);
}


@Bean
public ActiveMQComponent activemqComponent(JmsTransactionManager 
jmsTransactionManager, ConnectionFactory connectionFactory) {
    ActiveMQComponent activeMQComponent = new ActiveMQComponent();
    activeMQComponent.setTestConnectionOnStartup(true);
    activeMQComponent.setTransacted(true);
    activeMQComponent.setCacheLevelName("CACHE_CONSUMER");
    activeMQComponent.setConnectionFactory(connectionFactory);
    activeMQComponent.setTransactionManager(jmsTransactionManager);

    return activeMQComponent;
}

@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
    return new JmsTransactionManager(connectionFactory);
}

@Bean
public SpringTransactionPolicy springTransactionPolicy(TransactionTemplate transactionManager) {
    return new SpringTransactionPolicy(transactionManager);
}

public static void main(String[] args) {
    SpringApplication.run(EbecsIntegrationAdapterApplication.class, args);
    TestEnv testEnv = new TestEnv();
    testEnv.printEnvs();
}

TestEnv类:

@Component
public class TestEnv implements EnvironmentAware {

private Environment environment;

@Override
public void setEnvironment(Environment environment) {
    this.environment = environment;
}

public void printEnvs() {
    System.out.println(environment.getActiveProfiles()[0]);
}

}

1 个答案:

答案 0 :(得分:2)

假设EbecsIntegrationAdapterApplicationTestEnv位于同一包中

  • 省略不必要的注释 @SpringBootApplication已经是@Configuration组件,已经加载了application.properties,并且已经拥有@ComponentScan

  • 如果需要扫描其他软件包,则不要在软件包名称的末尾添加*。最好是坚持最佳实践using-boot-structuring-your-code

@SpringBootApplication
public class EbecsIntegrationAdapterApplication {
  • 删除main(args)中的new TestEnv()
  • 通过构造函数注入
  • 自动装配Environment
@Component
public class TestEnv {

  private Environment environment;

  public TestEnv(Environment environment) {
     this.environment = environment;
     printEnvs();
  }

  public void printEnvs() {
    System.out.println(environment.getActiveProfiles()[0]);
 }

}