【问题标题】:Spring - @Value returns nullSpring - @Value 返回 null
【发布时间】:2017-06-14 10:42:09
【问题描述】:

我在 /src/main/resources/ 下有一个属性文件,我想使用 Spring 从中加载数据。

在我的 Spring-context.xml 我有这个:

<context:property-placeholder location="classpath:UserUtil.properties" />

还有&lt;context:component-scan base-package="com.myApp" /&gt;

在我的课堂上,我像这样加载它:

@Value("${injectMeThis}")
private String injectMeThis;

但值始终为空

编辑:

要检查该值,我用这个:

System.out.println(new myClass().getInjectMeThis());

【问题讨论】:

  • 在 UserUtil.properties 中有injectMeThis=someValue吗?
  • 是的,我查过了,值在那里
  • 如果你做得对,它不可能是null。您是在使用 spring 托管实例,而不是使用 new YourClass() 自己创建实例吗?
  • 如果您自己创建类的实例(包含@Value 注释的类),则不会替换任何内容。
  • 您正在自己创建一个新实例,Spring 应该如何替换其中的值。您应该创建应用程序上下文的实例并从那里检索 bean。

标签: java spring spring-mvc


【解决方案1】:
System.out.println(new myClass().getInjectMeThis());

Spring 只会解析它知道的 bean 上的 @Value 注释。您使用的代码在 Spring 范围之外创建了一个类的实例,因此 Spring 不会对它做任何事情。

假设您已正确设置应用程序上下文,@Value 不能是 null,因为这将停止您的应用程序的正确启动。

您的 XML 文件包含 &lt;context:component-scan /&gt; 假设 myClass 是该包的一部分最简单的解决方案是将 @Component 添加到 myClass 然后从上下文中检索实例而不是创建新实例。

【讨论】:

    【解决方案2】:

    在您的班级中,添加班级级别注释@PropertySource("UserUtil.properties")。这应该可以解决问题。

    【讨论】:

    • 该注解只能在@Configuration 类上使用,不能在其他类上使用。此外,没有PropertySourcesPlaceHolderConfigurer&lt;context:property-placeholder /&gt; 的注释也不起作用。
    • 这适用于任何组件。不仅仅是@Configuration 类。
    • 那么它为什么对带有@Component注解的类起作用?
    • 它适用于@Configuration 类和 lite 配置类(基本上它(有点)由于ConfigurationClassUtils 中的条件而起作用。所以这取决于你的类是什么,但它没有t 适用于常规课程。(除此之外,它不在@Configuration 课程上也有点奇怪)。但在这里它不会产生影响,因为它(部分)与&lt;context:property-placeholder /&gt; 相同。
    • 它也适用于@Component 类。组件拥有它可能很奇怪,但只是想知道为什么它不应该适用于组件。
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多