Spring 引导:@Value returns 始终为空
Spring Boot: @Value returns always null
我想使用 application.properties
文件中的值,以便在另一个 class 的方法中传递它。问题是值 returns 总是 NULL
。可能是什么问题呢?提前致谢。
application.properties
filesystem.directory=temp
FileSystem.java
@Value("${filesystem.directory}")
private static String directory;
不能对静态变量使用@Value。您必须将其标记为非静态或在此处查看将值注入静态变量的方法:
https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/
编辑:以防万一 link 将来中断。您可以通过为静态变量创建非静态 setter 来做到这一点:
@Component
public class MyComponent {
private static String directory;
@Value("${filesystem.directory}")
public void setDirectory(String value) {
this.directory = value;
}
}
class 需要是一个 Spring bean,否则它不会被实例化并且 setter 将无法被 Spring 访问。
除了@Plog 的回答之外,您需要交叉检查的内容很少。
static
变量不能注入值。查看@Plog 的回答。
- 确保 class 用
@Component
或 @Service
注释
- 组件扫描应该扫描用于注册 bean 的封闭包。如果 xml 已启用配置,请检查您的 XML。
- 检查 属性 文件的路径是否正确或在 class 路径中。
OP 的其他答案可能是正确的。
但是,我 运行 出现了相同的症状(@Value
-带注释的字段 null
)但存在不同的潜在问题:
import com.google.api.client.util.Value;
确保您正在导入正确的 @Value
注释 class!尤其是如今 IDE 的便利性,这是一个非常容易犯的错误(我正在使用 IntelliJ,如果你自动导入太快而没有阅读你正在自动导入的内容,你可能会像我一样浪费几个小时)。
当然,要导入的正确 class 是:
import org.springframework.beans.factory.annotation.Value;
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;
}
}
对于在所有上述建议之后仍然面临问题的人,请确保在构造 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
}
}
希望这会帮助其他人避免浪费时间。
您可以使用 this. 参考来评估 (private String myVar)
的值
this.myVar
将@Autowired 注释添加到您的 class 的变量声明中。
@Autowired
private FileSystem myFileSystem;
我想使用 application.properties
文件中的值,以便在另一个 class 的方法中传递它。问题是值 returns 总是 NULL
。可能是什么问题呢?提前致谢。
application.properties
filesystem.directory=temp
FileSystem.java
@Value("${filesystem.directory}")
private static String directory;
不能对静态变量使用@Value。您必须将其标记为非静态或在此处查看将值注入静态变量的方法:
https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/
编辑:以防万一 link 将来中断。您可以通过为静态变量创建非静态 setter 来做到这一点:
@Component
public class MyComponent {
private static String directory;
@Value("${filesystem.directory}")
public void setDirectory(String value) {
this.directory = value;
}
}
class 需要是一个 Spring bean,否则它不会被实例化并且 setter 将无法被 Spring 访问。
除了@Plog 的回答之外,您需要交叉检查的内容很少。
static
变量不能注入值。查看@Plog 的回答。
- 确保 class 用
@Component
或@Service
注释
- 组件扫描应该扫描用于注册 bean 的封闭包。如果 xml 已启用配置,请检查您的 XML。
- 检查 属性 文件的路径是否正确或在 class 路径中。
OP 的其他答案可能是正确的。
但是,我 运行 出现了相同的症状(@Value
-带注释的字段 null
)但存在不同的潜在问题:
import com.google.api.client.util.Value;
确保您正在导入正确的 @Value
注释 class!尤其是如今 IDE 的便利性,这是一个非常容易犯的错误(我正在使用 IntelliJ,如果你自动导入太快而没有阅读你正在自动导入的内容,你可能会像我一样浪费几个小时)。
当然,要导入的正确 class 是:
import org.springframework.beans.factory.annotation.Value;
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;
}
}
对于在所有上述建议之后仍然面临问题的人,请确保在构造 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
}
}
希望这会帮助其他人避免浪费时间。
您可以使用 this. 参考来评估 (private String myVar)
的值this.myVar
将@Autowired 注释添加到您的 class 的变量声明中。
@Autowired
private FileSystem myFileSystem;