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... }
问题是, mValue
和mAnotherValue
总是为空…但在我的控制器中,该值正在加载正常。 是什么赋予了?
如果通过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... }