spring启动:@value总是返回null

4uqofj5v  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(532)

我想使用 application.properties 以便在另一个类的方法中传递它。问题是值总是返回 NULL . 有什么问题吗?提前谢谢。 application.propertiesfilesystem.directory=tempFileSystem.java ```
@Value("${filesystem.directory}")
private static String directory;

rbpvctlc

rbpvctlc1#

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

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

flmtquvp

flmtquvp2#

spring在找到@value注解时使用依赖注入来填充特定的值。但是,不是将值传递给示例变量,而是传递给隐式setter。这个setter然后处理name\u静态值的填充。

@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;
    }
}
3duebb1j

3duebb1j3#

其他的答案可能是正确的。
然而,我遇到了同样的症状( @Value -添加注解的字段 null )但有一个不同的基本问题: import com.google.api.client.util.Value; 确保导入的是正确的 @Value 注解类!特别是现在ide的便利性,这是一个非常容易犯的错误(我使用intellij,如果你自动导入太快而没有阅读你正在自动导入的内容,你可能会像我一样浪费几个小时)。
当然,要导入的正确类是: import org.springframework.beans.factory.annotation.Value;

tf7tbtn2

tf7tbtn24#

除了@plog的答案之外,你没有什么需要交叉核对的。 static 变量不能被注入值。检查@plog的答案。
确保用 @Component 或者 @Service 组件扫描应该扫描用于注册bean的封装包。如果启用了xml配置,请检查xml。
检查属性文件的路径是否正确或在类路径中。

dsekswqp

dsekswqp5#

不能在静态变量上使用@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;
    }
}

这个类需要是一个springbean,否则它将不会被示例化,并且setter将不能被spring访问。

相关问题