【问题标题】:Spring @Value("${}") often nullSpring @Value("${}") 经常为空
【发布时间】:2015-04-22 13:11:54
【问题描述】:

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

似乎@Value(s) 在我的@Bean/@Component 被创建之后被加载。

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

你有什么建议吗?

【问题讨论】:

  • “其他类”是否注册为spring beans?收到值的和没有收到值的有什么区别?
  • 当然,它们是 Bean 或 Component
  • 你在检查构造函数中的值吗?

标签: java spring spring-boot spring-bean spring-properties


【解决方案1】:

属性(以及所有的 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 并解析它的所有依赖项和属性值后执行。

【讨论】:

  • 谁会调用这个构造函数?我正在尝试,但未调用此“自定义”构造函数。
  • 您可能还拥有默认和自定义构造函数。去掉不带参数的那个。
  • 我不能,因为我有一个异常删除默认构造函数:没有找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException: it.modem.ModemManager.()
  • 然后尝试使用@PostConstruct 方法
  • 我已经完成了。它有效,但我不在构造函数中。那么构造函数内部不可能有值吗?
【解决方案2】:

当您将其解析为静态变量时,可能会发生这种情况。我曾经观察过这一点,并通过消除静电来解决它。正如人们常说的那样,使用静态时要小心。

【讨论】:

    【解决方案3】:

    你试过了吗:

    @Component
    @PropertySource("file:/your/file/path")
    public class MyBean {
    
      private @Value("${property}") String property;
      ...
    }
    

    【讨论】:

    • Using @PropertySource("classpath:application.properties") 我在启动过程中遇到异常:没有为依赖找到类型 [org.springframework.core.io.Resource] 的合格 bean:预计在至少 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.inject.Inject()}。谢谢
    • 你用@Component注释了类吗?
    • 是的。 @Evgeni 已经解决了这个问题。我不能像现在一样在构造函数中使用 Value 字段。
    【解决方案4】:

    另一个可能的原因是“@Value”行低于需要这些属性/值的行。

    我花了很多时间调试这个问题,发现行的顺序很重要!

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 1970-01-01
      • 2011-05-07
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多