Spring @Value注释总是评估为null?

Pol*_*878 30 java spring spring-mvc

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

my.value=123
another.value=hello world
Run Code Online (Sandbox Code Playgroud)

使用a加载此属性文件PropertyPlaceHolderConfigurer,该文件引用上面的属性文件.

我有以下类,我正在尝试加载这些属性,如下所示:

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

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

    // More below...
}
Run Code Online (Sandbox Code Playgroud)

问题是,mValue并且mAnotherValue总是为空...但在我的控制器中,正在加载的值很好.是什么赋予了?

ska*_*man 39

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

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

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


小智 27

我有类似的问题,但是春天的新手.我试图将属性加载到@Service,并尝试使用@Value来检索属性值...

@Autowired
public @Value("#{myProperties['myValue']}") String myValue;
Run Code Online (Sandbox Code Playgroud)

我花了一整天尝试各种注释组合,但它总是返回null.最后,答案一如既往地显而易见.

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

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

Spring中的所有内容都是Singleton,发生了什么是Spring将值加载到它的Singleton中,然后我'new'ed该类的另一个实例,它不包含新加载的值,所以它总是为null.

而是在@Controller中使用...

@Autowired
private MyService service; 
Run Code Online (Sandbox Code Playgroud)

调试......我做的一件事就是按照以下方式扩展我的服务......

@Service
public class MyService implements InitializingBean 
Run Code Online (Sandbox Code Playgroud)

然后在...中输入调试语句

@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
LOGGER.debug("property myValue:" + myValue);        
}
Run Code Online (Sandbox Code Playgroud)

在这里我可以看到在初始化时设置的值,后来当我在一个方法中打印它时它是null,所以这对我来说是一个很好的线索,它不是同一个实例.

这个错误的另一个线索是Tomcat抱怨Timeout试图从Socket中读取无法解析HTTPheader ......这是因为Spring创建了一个服务实例,所以我也是,所以我的那个人正在做真正的工作,而春天的实例已超时.


sco*_*eus 6

在这里查看我的答案。

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

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

确保您导入正确的@Value注释类!尤其是现在 IDE 很方便,这是一个非常容易犯的错误(我正在使用 IntelliJ,如果你自动导入得太快而没有阅读你正在自动导入的内容,你可能会像我一样浪费几个小时)。

正确的导入是:

org.springframework.beans.factory.annotation.Value