Активный профиль определен в app.props, однако переменная окружения возвращает пустой массив активных профилей - PullRequest
1 голос
/ 24 мая 2019

Проблема, с которой я столкнулся: активный профиль, определенный в application.properties через spring.profiles.active = development. Однако, когда я использую переменную среды Spring для 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 Ответ

2 голосов
/ 24 мая 2019

при условии, что EbecsIntegrationAdapterApplication и TestEnv находятся в одной упаковке

  • пропустить ненужные аннотации @SpringBootApplication уже является @Configuration компонентом, уже загружает ваши application.properties и уже @ComponentScan

  • Если вам нужно сканировать дополнительные пакеты, вы НЕ должны добавлять * в конце имени пакета. Лучше всего придерживаться лучших практик использование-загрузки-структурирование вашего кода

@SpringBootApplication
public class EbecsIntegrationAdapterApplication {
  • удалить new TestEnv() в основном (args)
  • autowire 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]);
 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...