java - app.props 中定义的 Activity 配置文件,但是环境变量返回 Activity 配置文件的空数组

标签 java spring-boot

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

已经尝试 Autowiring 环境变量但无济于事。该类用 @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();
}

测试环境类:

@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]);
}

}

最佳答案

假设 EbecsIntegrationAdapterApplicationTestEnv 位于同一个包中

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

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

@SpringBootApplication
public class EbecsIntegrationAdapterApplication {
  • 删除 main(args) 中的 new TestEnv()
  • 通过构造函数注入(inject) Autowiring 环境
@Component
public class TestEnv {

  private Environment environment;

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

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

}

关于java - app.props 中定义的 Activity 配置文件,但是环境变量返回 Activity 配置文件的空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56294076/

相关文章:

java - 如何使用套接字与socketio交互

java - Spring:为什么在每个测试类结束时不调用@PreDestroy?

java - Spring boot jpa/hibernate 遇到列类型错误(json字段)

java - Maven 不在代理后面下载 jar

java - 普通 Java 套接字中没有密码套件

java - 将 maven 与来自第三方的 DLL 结合使用并管理 DLL 的名称

java - 如何在 BroadcastReceiver 中打开数据库

java - 使用 Spring Boot Starter POM 进行开发和生产

java - 在 ConstraintValidator 中注入(inject) EntityManager

java - 使用EntityManager通过jdbcAuthentication实现Spring Security