【发布时间】:2011-07-13 15:23:20
【问题描述】:
尝试将属性自动连接到 Spring 3.0.5.RELEASE 中的 bean,我正在使用:
-
config.properties:username=myusername -
main-components.xml:<context:property-placeholder location="classpath:config.properties" /> -
我的班级:
@Service public class MyClass { @Value("${username}") private String username; ... }
因此,用户名被设置为 literally "${username}",因此表达式不会被解析。我对此类的其他自动关联依赖项已设置,并且 Spring 不会引发任何异常。我也尝试添加@Autowired,但没有帮助。
如果我将属性解析为单独的 bean,然后使用 @Autowired + @Qualifier,它可以工作:
<bean id="username" class="java.lang.String">
<constructor-arg value="${username}"/>
</bean>
任何想法如何使用@Value?也许我需要包含一些我没有的 Spring 依赖项?谢谢
【问题讨论】:
-
您确定
<context:property-placeholder>与您的MyClassbean 在同一个应用程序上下文中(不在父上下文中)吗? -
你是对的。我将
从 ContextLoaderListener 定义的上下文移动到 servlet 上下文。现在我的值被解析了。非常感谢! -
这里非常有用的事情是将 ignore-unresolvable-placeholders 设置为 false - 因此如果无法解析占位符,应用程序将失败 - 这就是您的问题
-
在想知道为什么我的@Value 注释不起作用数小时后找到了这个答案 :( 正如other post BeanPostProcessor 中提到的那样,即使在相同的层次结构中,BeanPostProcessor 也不会跨容器共享
-
你可以@Autowire Environment 然后 environment.getProperty("name")。见stackoverflow.com/a/15562319/632293
标签: spring frameworks properties autowired