我遇到的问题是:通过 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]);
}
}
最佳答案
假设 EbecsIntegrationAdapterApplication
和 TestEnv
位于同一个包中
省略不需要的注释
@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/