我也遇到过类似的问题,但当时对Spring还不太熟悉。
我尝试将属性加载到一个@Service中,并尝试使用@Value检索属性值...
@Autowired
public @Value("#{myProperties['myValue']}") String myValue;
我花了一整天的时间尝试各种注释的组合,但它总是返回null。事实上,最后答案总是显而易见。
1)确保Spring正在扫描您的类以获取注释,并包括包层次结构在您的servlet.xml中(它将扫描插入的基本值下面的所有内容)。
2)确保您没有'new'该类,而是在@Controller类中使用@Autowire。Spring中的所有内容都是单例的,发生的情况是Spring将值加载到其单例中,然后我“new”了该类的另一个实例,该实例不包含新加载的值,因此它始终为null。
代替在@Controller中使用...
@Autowired
private MyService service
调试...
我找到问题的一个方法是按照以下方式扩展我的服务...
@Service
public class MyService implements InitializingBean
然后在代码中加入调试语句...
@Override
public void afterPropertiesSet() throws Exception {
LOGGER.debug("property myValue:" + myValue);
}
我能在初始化时看到值被设定,但当我在一个方法中打印它时,它是 null 的。这给了我一个很好的线索,说明它不是同一个实例。
另一个错误的线索是 Tomcat 抱怨超时,试图从 Socket 中读取并出现了“无法解析 HTTP header”的错误...... 这是因为 Spring 创建了一个服务实例,我也创建了一个,所以我的实例正在执行真正的工作,而 Spring 的实例已经超时了。