gpt4 book ai didi

java - 如何在 Spring 中使用附加到当前应用程序上下文的环境来初始化属性占位符?

转载 作者:行者123 更新时间:2023-12-02 06:17:41 25 4
gpt4 key购买 nike

我正在使用 Spring Framework 3.2.6.RELEASE。

我正在尝试使用命令行界面(使用 JOptCommandLinePropertySource)通过

PropertySource<?> propertySource = new JOptCommandLinePropertySource(options);
final GenericApplicationContext context = new GenericApplicationContext();
context.getEnvironment().getPropertySources().addFirst(propertSource);
...

我有这个 beans 配置器:

package com.example;

@Configuration
public class AppConfig {
@Value("${prop1}")
private String prop1;

@Bean
public MyBean myBean() {
MyBean ret = new MyBean();
ret.init(prop1);
return ret;
}
}

我正在使用命令行参数启动我的程序:--prop1=prop_value

如果我用这个 xml 进行初始化:

<beans>
<context:annotation-config />
<context:property-placeholder />
<context:component-scan base-package="com.example" />
</beans>

然后我收到此错误:无法解析字符串值“${prop1}”中的占位符“prop1”

13:47:36.932 [main] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'AppConfig': AutowiredFieldElement for private java.lang.String com.example.AppConfig.prop1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.AppConfig.prop1; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'prop1' in string value "${prop1}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
...

但是使用这个 xml 一切都可以正常工作:

<beans>
<context:annotation-config />
<context:component-scan base-package="com.example" />

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="environment" ref="environment" />
</bean>
</beans>

为什么 PropertySourcesPlaceholderConfigurer 不检查 Javadoc 中定义的当前应用程序上下文的环境?

Specialization of PlaceholderConfigurerSupport that resolves ${...} placeholders within bean definition property values and @Value annotations against the current Spring Environment and its set of PropertySources.

最佳答案

使用命名空间配置时,建议使用无版本 xsd。所以而不是 http://www.springframework.org/schema/context/spring-context-2.5.xsd建议使用http://www.springframework.org/schema/context/spring-context.xsd 。这确保了 spring 将使用类路径上可用的 xsd 的最新版本。

关于<context:property-placeholder /> Spring 3.1 中关于默认配置的一些重大更改(?)。在 Spring 3.1 之前,默认值为 system-properties-mode属性是 FALLBACK,在 Spring 3.1 中这会导致创建 PropertyPlaceholderConfigurer而不是PropertySourcesPlaceholderConfigurer 。默认值是在特定的 xsd 中配置的。 (就像 Spring 3.1 一样,它是环境)。

因此,使用较旧的 xsd 会导致属于该特定版本的 xsd 的默认行为,请切换到 3.2 xsd 或无版本 xsd。 (如前所述,建议使用后者)。

关于java - 如何在 Spring 中使用附加到当前应用程序上下文的环境来初始化属性占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21304898/

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