【问题标题】:Spring Boot: @Value returns always nullSpring Boot:@Value 始终返回 null
【发布时间】:2018-02-12 10:30:23
【问题描述】:

我想使用来自application.properties 文件的值,以便在另一个类的方法中传递它。问题是该值总是返回NULL。可能是什么问题呢?提前致谢。

application.properties

filesystem.directory=temp

FileSystem.java

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

【问题讨论】:

    标签: java spring-boot application.properties


    【解决方案1】:

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

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

    编辑:以防万一将来链接中断。您可以通过为您的静态变量创建一个非静态设置器来做到这一点:

    @Component
    public class MyComponent {
    
        private static String directory;
    
        @Value("${filesystem.directory}")
        public void setDirectory(String value) {
            this.directory = value;
        }
    }
    

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

    【讨论】:

    • 感谢您的回答,但它仍然打印空值。
    • @JonathanWilliams 是 Spring bean 中的成员变量吗? @Value 注解仅适用于 Spring bean,不适用于任意其他 Java 类。
    • 我做了一些修改。你的班级是Spring bean吗?即它是否用@Component 注释?
    • 是的,没错,它是用@Component注解的。
    • 这不应该在这里提供吗?静态变量与此无关,因为它们是此类的每个实例都使用的单例。 MyComponent.directory=value 应该可以工作
    【解决方案2】:

    对于在上述所有建议之后仍然面临问题的人,请确保在构造 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
       }
    }
    

    希望这能帮助人们避免浪费时间。

    【讨论】:

    • 这是我的解决方案。我一直在构造函数中使用这些属性。所以我把初始化的东西移到@PostConstruct 并在那里初始化它们。
    • 终于有了一个有意义的答案。按说明工作
    【解决方案3】:

    除了@Plog 的回答之外,您几乎没有什么需要交叉检查的。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

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

      【讨论】:

        【解决方案5】:

        Spring 在找到 @Value 注解时使用依赖注入来填充特定的值。但是,不是将值传递给实例变量,而是将其传递给隐式 setter。然后这个 setter 处理我们的 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;
            }
        }
        

        【讨论】:

          【解决方案6】:

          您可以利用 this. 参考来评估 (private String myVar) 的值

          this.myVar
          

          【讨论】:

            猜你喜欢
            • 2018-02-24
            • 1970-01-01
            • 1970-01-01
            • 2018-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-01
            • 1970-01-01
            相关资源
            最近更新 更多