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

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

my.value=123 another.value=hello world 

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

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

 public class Config { @Value("${my.value}") private String mValue; @Value("${another.value}") private String mAnotherValue; // More below... } 

问题是, mValuemAnotherValue总是为空…但在我的控制器中,该值正在加载正常。 是什么赋予了?

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

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

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

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

 @Autowired public @Value("#{myProperties['myValue']}") String myValue; 

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

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

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

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

而是在@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抱怨Timeout试图从Socket中读取无法解析HTTPheader ……这是因为Spring创建了一个服务实例,所以我也是,所以我的那个人正在做真正的工作,而spring的实例正在超时。

在使用@Controller ,您似乎正在自己实例化Config 。 让Spring实例化它。

到应用程序上下文文件中。

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

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

 @Service public class Config { private static String mValue; private static String mAnotherValue; @Value("${my.value}") public void setmValue(String mValue) { this.mValue = mValue;} @Value("${another.value}") public void setmAnotherValue(String mAnotherValue) { this.mAnotherValue = mAnotherValue;} //rest of your code... }