gpt4 book ai didi

java - 带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件无法解析 @Value 注释

转载 作者:IT老高 更新时间:2023-10-28 13:50:24 26 4
gpt4 key购买 nike

我有以下配置文件:

@Configuration
public class PropertyPlaceholderConfigurerConfig {

@Value("${property:defaultValue}")
private String property;

@Bean
public static PropertyPlaceholderConfigurer ppc() throws IOException {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setLocations(new ClassPathResource("properties/" + property + ".properties"));
ppc.setIgnoreUnresolvablePlaceholders(true);
return ppc;
}
}

我使用以下 VM 选项运行我的应用程序:

-Dproperty=propertyValue

所以我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,在这个阶段没有处理 @Value 注释并且属性是 null。另一方面,如果我通过 xml 文件配置了 PropertyPlaceholderConfigurer - 一切都按预期完美运行。 xml文件示例:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="location">
<value>classpath:properties/${property:defaultValue}.properties</value>
</property>
</bean>

如果我尝试在另一个 Spring 配置文件中注入(inject)属性值 - 它被正确注入(inject)。如果我将 PropertyPlaceholderConfigurer bean 创建移动到该配置文件 - 字段值再次为空。

作为解决方法,我使用这行代码:

System.getProperties().getProperty("property", "defaultValue")

这也是可行的,但我想知道为什么会发生这种行为,也许可以用其他方式重写它但没有 xml?

最佳答案

从 Spring JavaDoc :

In order to resolve ${...} placeholders in definitions or @Value annotations using properties from a PropertySource, one must register a PropertySourcesPlaceholderConfigurer. This happens automatically when using context:property-placeholder in XML, but must be explicitly registered using a static @Bean method when using @Configuration classes. See the "Working with externalized values" section of @Configuration's javadoc and "a note on BeanFactoryPostProcessor-returning @Bean methods" of @Bean's javadoc for details and examples.

因此,您尝试在启用占位符处理所需的代码块中使用占位符。

正如@M.Deinum 提到的,您应该使用 PropertySource(默认或自定义实现)。

下面的示例展示了如何在 PropertySource 注释中使用属性,以及如何在字段中从 PropertySource 注入(inject)属性。

@Configuration
@PropertySource(
value={"classpath:properties/${property:defaultValue}.properties"},
ignoreResourceNotFound = true)
public class ConfigExample {

@Value("${propertyNameFromFile:defaultValue}")
String propertyToBeInjected;

/**
* Property placeholder configurer needed to process @Value annotations
*/
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}

2021 年 9 月更新

正如 Koray 在评论中提到的,PropertySourcesPlaceholderConfigurer 自 Spring 4.3+/Spring Boot 1.5+ 起不再需要。动态文件名可用于 @PropertySource@ConfigurationProperties 注解中的属性文件,无需额外配置。

@Configuration
@PropertySource(
value={"classpath:properties/${property:defaultValue}.properties"},
ignoreResourceNotFound = true)
public class ConfigExample {

@Value("${propertyNameFromFile:defaultValue}")
String propertyToBeInjected;
}
@ConfigurationProperties("properties/${property:defaultValue}.properties")
public class ConfigExample {

String propertyNameFromFile;
}

关于java - 带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件无法解析 @Value 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33344895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com