【问题标题】:Spring 3.0.5 doesn't evaluate @Value annotation from propertiesSpring 3.0.5 不评估属性中的 @Value 注释
【发布时间】: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")。见stackoverflow.com/a/15562319/632293

标签: spring frameworks properties autowired


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2011-05-07
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多