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 总是空的……但在我的控制器中,值加载得很好。是什么赋予了?

原文由 Polaris878 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 561
2 个回答

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

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

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

原文由 skaffman 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

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

1)通过在您的 servlet.xml 中包含包层次结构,确保 Spring 正在扫描您的类以获取注释(它将扫描低于您插入的基值的所有内容。

  1. 确保你不是在“新建”你刚刚告诉 Spring 要查看的类。相反,您在 @Controller 类中使用 @Autowire。

Spring 中的一切都是单例,发生的事情是 Spring 将值加载到它的单例中,然后我“新建”了该类的另一个实例,该实例不包含新加载的值,因此它始终为 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);
}

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

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

原文由 Rob 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题