Spring Boot:@Value返回null

时间:2017-09-04 08:05:29

标签: java spring-boot application.properties

我想使用application.properties文件中的值,以便在另一个类的方法中传递它。问题是值始终为NULL。可能是什么问题呢?提前谢谢。

application.properties

filesystem.directory=temp

FileSystem.java

@Value("${filesystem.directory}")
private static String directory;

6 个答案:

答案 0 :(得分:18)

您不能在静态变量上使用@Value。您必须将其标记为非静态,或者在此处查看将值注入静态变量的方法:

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/

编辑:以防链接在将来中断。您可以通过为静态变量创建非静态setter来完成此操作:

@Component
public class MyComponent {

    private static String directory;

    @Value("${filesystem.directory}")
    public void setDirectory(String value) {
        this.directory = value;
    }
}

该类需要是一个Spring bean,否则它将不会被实例化,并且Spring将无法访问该setter。

答案 1 :(得分:6)

对于经过上述所有建议后仍面临问题的人,请确保在构造bean之前没有访问该变量。

也就是说:

代替这样做:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar = foo(myVar); // <-- myVar here is still null!!!
}

执行以下操作:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar;

   @PostConstruct  
   public void postConstruct(){

      anotherVar = foo(myVar); // <-- using myVar after the bean construction
   }
}

希望这将有助于避免浪费时间的人。

答案 2 :(得分:5)

除了@ Plog的答案之外,你几乎没有什么可以交叉检查的。

static个变量不能注入值。检查@ Plog的答案。

  • 确保使用@Component@Service
  • 注释课程
  • 组件扫描应扫描封闭包以注册bean。如果启用了xml配置,请检查XML。
  • 检查属性文件的路径是否正确或在类路径中。

答案 3 :(得分:1)

其他答案可能对OP是正确的。

但是,我遇到了相同的症状(@Value带有注释的字段为null),但是存在不同的潜在问题:

import com.google.api.client.util.Value;

确保您要导入正确的@Value注释类!尤其是在如今具有IDE便利的情况下,这是一个非常容易犯的错误(我正在使用IntelliJ,并且如果您自动导入速度太快而没有阅读您要自动导入的内容,那么您可能会像我一样浪费几个小时)。

当然,要导入的正确类是:

import org.springframework.beans.factory.annotation.Value;

答案 4 :(得分:0)

Spring在找到@Value批注时使用依赖项注入来填充特定值。但是,不是将值传递给实例变量,而是将其传递给隐式设置器。然后,此设置器将处理我们的NAME_STATIC值。

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}

答案 5 :(得分:0)

您可以利用this.参考来评估(私有String myVar)

this.myVar