Spring 3.0.5 不评估属性中的 @Value 注释

Posted

技术标签:

【中文标题】Spring 3.0.5 不评估属性中的 @Value 注释【英文标题】:Spring 3.0.5 doesn't evaluate @Value annotation from properties 【发布时间】: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 依赖项?谢谢

【问题讨论】:

您确定&lt;context:property-placeholder&gt; 与您的MyClass bean 在同一个应用程序上下文中(不在父上下文中)吗? 你是对的。我将 从 ContextLoaderListener 定义的上下文移动到 servlet 上下文。现在我的值被解析了。非常感谢! 这里非常有用的事情是将 ignore-unresolvable-placeholders 设置为 false - 因此如果无法解析占位符,应用程序将失败 - 这就是您的问题 在想知道为什么我的@Value 注释不起作用数小时后找到了这个答案 :( 正如other post BeanPostProcessor 中提到的那样,即使在相同的层次结构中,BeanPostProcessor 也不会跨容器共享 你可以@Autowire Environment 然后 environment.getProperty("name")。见***.com/a/15562319/632293 【参考方案1】:

找到问题所在。从 cmets 复制/粘贴:

您确定在与您的 MyClass bean 相同的应用程序上下文中拥有 &lt;context:property-placeholder&gt;(而不是在父上下文中)吗? – axtavt

你是对的。我将&lt;context:property-placeholder&gt;ContextLoaderListener 定义的上下文移动到servlet 上下文。现在我的值被解析了。非常感谢! - 亚历克斯

【讨论】:

以上是关于Spring 3.0.5 不评估属性中的 @Value 注释的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring bean 有条件地设置属性值时,SpEL 条件运算符未按预期进行评估(使用 XML 配置)

你能防止 Lua 中的短路评估吗?

我们是不是评估 cross_val_score 的准确性,然后评估测试数据的准确性?

使用 cross_val_score 评估多项式回归

在 sklearn cross_val_score 上评估多个分数

216 jQuery 文本属性值:html() text() val()