Java Spring@Value注释始终计算为null?

Java Spring@Value注释始终计算为null?,java,spring,spring-mvc,Java,Spring,Spring Mvc,因此,我有一个简单的属性文件,其中包含以下条目: my.value=123 another.value=hello world 正在使用引用上述属性文件的PropertyPlaceHolderConfigure加载此属性文件 我有一个类,我正试图为它加载这些属性,就像这样: public class Config { @Value("${my.value}") private String mValue; @Value("${another.value}")

因此,我有一个简单的属性文件,其中包含以下条目:

my.value=123
another.value=hello world
正在使用引用上述属性文件的
PropertyPlaceHolderConfigure
加载此属性文件

我有一个类,我正试图为它加载这些属性,就像这样:

public class Config
{
    @Value("${my.value}")
    private String mValue;

    @Value("${another.value}")
    private String mAnotherValue;

    // More below...
}

问题是,
mValue
mAnotherValue
始终为空。。。然而,在我的控制器中,值被加载得很好。给出了什么?

当它与
@Controller
一起工作时,似乎您正在自己实例化
配置。让Spring实例化它。

如果通过
new
手动实例化
Config
的实例,则Spring不会参与,因此注释将被忽略

如果无法更改代码以使Spring实例化bean(可能使用
原型
作用域bean),那么另一个选项是使用Spring的加载时类加载器编织功能(请参阅)。这是一些低级的AOP,它允许您像平常一样实例化对象,但是Spring将通过应用程序上下文传递它们,以使它们连接、配置、初始化等

不过,它并不适用于所有平台,因此请阅读上面的文档链接,看看它是否适用于您。

添加到您的应用程序上下文文件中


然后将
@Configurable
注释添加到
Config
类中。

我也有类似的问题,但我是Spring的新手。 我试图将属性加载到@Service中,并尝试使用@Value检索属性值,使用

@Autowired
public @Value("#{myProperties['myValue']}") String myValue;
我花了一整天的时间尝试各种注释组合,但它总是返回null。 最终,答案总是在事实发生后显而易见

1) 确保Spring通过包含包层次结构来扫描类中的注释 在servlet.xml中(它将扫描插入的基值以下的所有内容)

2) 确保你不是刚告诉Spring去看的新课程。相反,您在@Controller类中使用@Autowire

Spring中的一切都是一个单例,发生的事情是Spring将值加载到它的单例中,然后我“新建”了另一个不包含新加载值的类实例,所以它总是空的

而是在@Controller中使用

@Autowired
private MyService service; 
调试。。。 我做了一件事,发现这是延长我的服务如下

@Service
public class MyService implements InitializingBean 
然后将调试语句放入

@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
LOGGER.debug("property myValue:" + myValue);        
}
在这里,我可以看到初始化时设置的值,后来我在一个方法中打印它时,它为null,因此这对我来说是一个很好的线索,它不是同一个实例


这个错误的另一个线索是Tomcat抱怨试图读取套接字时超时,无法解析HTTPheader。。。这是因为Spring创建了该服务的一个实例,我也创建了该服务的一个实例,所以我的一个实例正在进行实际工作,Spring在其实例上超时。

您还可以将您的属性设置为私有,确保您的类是一个使用
@Service
@Component
注释的Springbean,这样它总是被实例化,最后添加带有
@Value
注释的setter方法。这将确保为属性分配application.properties或yml配置文件中指定的值

@Service
public class Config {
    private static String myProperty;

    private static String myOtherProperty;

    @Value("${my.value}")    
    public void setMyProperty(String myValue) {
    this.myProperty = myValue;}

    @Value("${other.value}")
    public void setMyOtherProperty(String otherValue) {
    this.myOtherProperty = otherValue;}

    //rest of your code...
}
看看我的答案

我遇到了相同的症状(
@Value
-注释字段为
null
),但有不同的根本问题:

import com.google.api.client.util.Value


确保您正在导入正确的
@值
注释类!特别是现在IDE的便利性,这是一个很容易犯的错误(我使用IntelliJ,如果您在没有阅读自动导入内容的情况下自动导入太快,您可能会像我一样浪费几个小时)。

配置类定义为Springbean吗?否?我该如何使用注释呢?我试着在类上使用“@Component”和“@Controller”,但这两种方法都不起作用,那么它在
Controller
中的作用如何呢?你的控制器有什么不同?这就是我很困惑的地方。。。Config类在同一个包中,所有内容。。。唯一的区别是,在我的控制器工作时,我实际上有一个请求映射。。。我自己给建造师打电话。那么,我如何访问这些属性?如果我不能访问这些属性,这基本上意味着我需要找到其他方法来加载配置,因为如果这些属性仅在某些情况下可用,Spring属性加载程序将不会剪切这些属性。@Polaris878:让Spring实例化它。我们有什么问题吗?或者自己使用
ResourceBundle
。嘿,斯卡夫曼,谢谢你的建议。。。问题是我正在从JSP实例化
Config
。我不确定我是否能找到解决办法?也许通过使用某种工厂?@Polaris878:我的建议对JSP实例化对象(任何通过反射实例化的对象)+1仍然有效。我想知道关于春天的那个细节。好几年没碰它了。愚蠢的工作场所。。。这救了我!正在尝试读取属性文件,但不确定@Value为什么给出null我尝试了所有指南,检查了50次配置,使用了所有可能的注释。。差点疯了,然后我决定测试控制器是否看到了该属性。。对还有服务!在我的例子中,这实际上是使用
new
:dwat is myProperties初始化的服务中使用的对象。你能解释一下吗?我的情况是2。从声明为
new
切换到
@Autowired
解决了我的问题。很棒的发现!在我的例子中,我用“org.springframework.boot”插件超越了常规的spring引导依赖关系