Spring的@Value("${}")经常为null。

19

我正在使用Spring Boot应用程序。在某些@Component类中,@Value字段被加载,而在其他类中它们始终为null

看起来@Value是在我的@Bean/@Component创建后才加载的。

我需要从属性文件中加载一些值到我的@Bean中。

你有什么建议吗?


“其他类”是否已注册为Spring Bean?接收值的类和不接收值的类之间有什么区别? - Evgeni Dimitrov
当然,它们可以是Bean或Component。 - drenda
你在构造函数中检查数值了吗? - Evgeni Dimitrov
4个回答

54

属性(和所有bean依赖项)在bean构造完成后(即执行构造函数后)进行注入。

如果需要在构造函数中使用它们,可以使用构造函数注入。

@Component
public class SomeBean {
    private String prop;
    @Autowired
    public SomeBean(@Value("${some.prop}") String prop) {
        this.prop = prop;
        //use it here
    }
}

另一种选择是将构造函数逻辑移动到使用@PostConstruct注释的方法中,它将在bean创建后执行,并解析其所有依赖项和属性值。


那么谁会调用这个构造函数呢?我正在尝试,但是这个“自定义”构造函数没有被调用。 - drenda
你可能也有默认构造函数和自定义构造函数。移除没有参数的那个。 - Evgeni Dimitrov
我无法这样做,因为我有一个异常,删除默认构造函数:未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException: it.modem.ModemManager.<init>()。 - drenda
2
然后尝试使用@PostConstruct方法。 - Evgeni Dimitrov
我还没有完成它。它能工作,但我不在构造函数里面。所以在构造函数里面是不可能有值的吗? - drenda

1

当你将它解析为静态变量时,这种情况可能会发生。我之前曾经观察到过这种情况,并通过去掉static来解决它。正如人们常说的那样,在使用static时要小心谨慎。


0

你尝试过了吗:

@Component
@PropertySource("file:/your/file/path")
public class MyBean {

  private @Value("${property}") String property;
  ...
}

使用@PropertySource("classpath:application.properties")时,在启动过程中出现异常:找不到类型为[org.springframework.core.io.Resource]的合格bean,该依赖项预期至少有1个bean符合自动装配候选项。依赖注释:{@javax.inject.Inject()}。谢谢。 - drenda
дҪ жҳҜеҗҰдҪҝз”Ё@ComponentжіЁи§ЈдәҶиҜҘзұ»пјҹ - Efe Kahraman
是的。@Evgeni 已经解决了问题。由于目前的情况下,我无法在构造函数中使用 Value 字段。 - drenda

-2
另一个可能的原因是 '@Value' 行在需要这些属性/值的行下面。
我花了很多时间调试这个问题,并发现行的顺序很重要!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接