gpt4 book ai didi

java - 解析@PropertySource中的占位符

转载 作者:行者123 更新时间:2023-11-30 08:08:20 35 4
gpt4 key购买 nike

我正在尝试创建一个配置类,该类将使用 @PropertySource 注释从文件加载应用程序属性,但 PropertySourcesPlaceholderConfigurer 似乎没有设置从注释接收的位置。

@Configuration
@ComponentScan("com.just.a.test")
@PropertySources({
@PropertySource(value="file:C:\\tmp\\1.cfg"
, ignoreResourceNotFound=true)
})
public class TestConfig {
@Value("${just.a.string}")
String justAString;


@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
return propertySourcesPlaceholderConfigurer;
}
}

应用程序属性文件是:

just.a.string=DOH

并且我收到以下异常:

.... Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'just.a.string' in string value "${just.a.string}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:801)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:955)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 15 more

但是,如果我使用 PropertySourcesPlaceholderConfigurer bean 设置位置,则一切正常。

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocation(new FileSystemResource("c:\\tmp\\1.cfg"));
return propertySourcesPlaceholderConfigurer;
}

我正在使用 Spring 4.1.6-RELEASE 和 jdk 8.05。

提前致谢。

更新1

正如 sivaprasadreddy.k 提到的。上面的代码确实工作正常,我忘记了在我的原始代码中我使用 -

从 JVM 参数中检索文件
@PropertySource(value="file:#{systemProperties['config.path']}" 

并传递 jvm 参数:

-Dconfig.path=C:\\tmp\\1.cfg

@Sotirios - 我只是像这样使用 AnnotationConfigApplicationContext(Class) -

public static void main(String[] args) { 
new AnnotationConfigApplicationContext(TestConfig.class);
}

更新2

基本上我想要实现的是:

1) 使用名称定义为 const 的 jvm 参数加载属性文件

a) 如果找到文件则继续

b) 否则,如果存在定义为 const 的默认文件路径,则继续

c) 否则继续。

2) 尝试使用名称定义为 const 的属性来解析 @Value

a) 如果找到则继续

b) 否则使用 const 加载默认值。

抱歉,有空格。编辑器出了问题。

最佳答案

考虑您的编辑

@PropertySource(value="file:#{systemProperties['config.path']}" 

你必须首先意识到@Configuration类(及其注释)在 @Bean 之前被解析和处理。里面声明了。换句话说,您的PropertySourcesPlaceholderConfig (解析 #{..} 占位符)在 Spring 处理 @PropertySource 时尚未注册注解。不可用。

相反,Spring 可以执行 PropertySourcesPlaceholderConfig 提供的行为的子集。 ,只有${..}占位符。 ( See the javadoc 。)并且它只能使用已在您的 ApplicationContext 中注册的属性源。的Environment 。在您的示例中,(应该)只有两个来源:系统属性和系统环境。

符号

systemProperties['config.path']

状态:给我该属性的值 config.path在名为 systemProperties 的属性源中。我不确定 Spring 按什么顺序检查上面指定的属性源,但如果您知道只有您的系统属性(而不是环境)具有 config.path属性,您可以简单地使用

@PropertySources(value = { @PropertySource(value = "file:${config.path}") })

关于java - 解析@PropertySource中的占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30764534/

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