我正在尝试使用Spring框架构建一个控制台应用程序。
我有一个由@SpringBootApplication
注释的课程:
@SpringBootApplication
public class LoaderApplication {
public static void main(String[] args) {
SpringApplication.run(LoaderApplication.class, args);
}
}
由@Component
@Component
public class ElasticLoader implements CommandLineRunner {
// Elastic properties
@Value("${elasticTransportAddress:#{null}}")
private String elasticTransportAddress;
private static final Logger log = LoggerFactory.getLogger(ElasticLoader.class);
@Override
public void run(String... arg) throws Exception {
if (!( elasticTransportAddress != null && elasticTransportAddress.isEmpty() )) {
log.error("[elasticTransportAddress] is not defined in property file");
return;
}
log.info("-> ElasticLoader.run");
}
}
正如您所看到的,在此类中,我正在尝试通过elasticTransportAddress
注释注入属性@Value
值,但在运行我的应用程序后,我可以看到属性elasticTransportAddress
保持未分配状态。 / p>
我错过了什么?
让我补充一些注意事项:
我想将我的应用程序用于不同的属性文件。对于这种情况,我创建了xml-context-config.xml
这样的内容:
<beans profile="companies">
<!-- allows for ${} replacement in the spring xml configuration from the
application-default.properties, application-dev files on the classpath -->
<context:property-placeholder
location="classpath:companies.properties"
ignore-unresolvable="true" />
<!-- scans for annotated classes in the com.env.dev package -->
<context:component-scan base-package="ru.alexeyzhulin" />
</beans>
并使用我放在
中的配置文件companies.properties
我使用描述的配置文件运行配置:
正如我在应用程序日志中看到的那样启用此配置文件:
2017-01-15 00:10:39.697 INFO 10120 --- [ main] ru.alexeyzhulin.LoaderApplication : The following profiles are active: companies
但是,当我在application.properties
中定义属性并使用默认配置文件时,属性elasticTransportAddress
将被分配。
答案 0 :(得分:3)
if
条件中有错误。
这个:
if (!( elasticTransportAddress != null && elasticTransportAddress.isEmpty() ))
相当于:
if (elasticTransportAddress == null || !elasticTransportAddress.isEmpty())
因此,在两种情况下,您会收到错误日志消息+ return:
修复是重写if
条件,例如
if (elasticTransportAddress == null || elasticTransportAddress.isEmpty())
更新1:您当然需要确保此值在应用程序属性中真正定义。
更新2:您的xml-context-config.xml
文件根本不被Spring使用。
建议的方法是使用@SpringBootApplication
的基于注释的配置。您可以通过完全删除xml-context-config.xml
和创建使用@Configuration 注释的类来完成此操作。此配置类可以包含定义属性源的注释。例如:
@Configuration
@Profile("companies")
@PropertySource("classpath:companies.properties")
public final class LoaderApplication {
}
请注意,如果您使用@ComponentScan
,则不需要明确启用@SpringBootApplication
。
答案 1 :(得分:2)
将companies.properties重命名为application-companies.properties。 Link到文档
答案 2 :(得分:1)
正如其他@Alex所说,你必须告诉Spring你想要检索这些属性的位置。你在这里缺少的是另一种配置,在你的情况下(基于注释的配置)你必须添加这个类:
@Configuration
public class MyConfiguration {
@Bean
public PropertyPlaceholderConfigurer getCompanyConfigurer() throws IOException {
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setLocations(new ClassPathResource("classpath:companies.properties"));
configurer.setIgnoreUnresolvablePlaceholders(true);
return configurer;
}
}
更新
如果您使用的是基于XML的配置,则必须告诉Spring Boot在LoaderApplication中删除注释@SpringBootApplication的XML配置是什么,并以这种方式将XML添加到SpringApplication:
SpringApplication.run("classpath:application-configuration.xml", args);
最后将此行添加到xml:
<context:property-placeholder ignore-unresolvable="true" location="classpath:companies.properties"/>
而且,就是这样,希望它有所帮助。