SpringBoot中@Value注入失败问题解决步骤
作者:待续301
SpringBoot中@Value注入失败问题解决步骤
1. 第一步检测语法是否正确
@Value("${aes.key}") private String key; @Value("${aes.secret}") private String secret;
2.第二步检测配置文件中是否有进行配置
aes: key: xxxx secret: xxxxxxx
3.第三步检测类是否增加了能被spring管理的注解
在spring中,使用了spring的注解,那么就需要使用spring来进行管理对象,而不能自己进行new,否则就会导致失败。例如类 @Controller @Service @Component 等能被spring管理的注解
4.第四步检测配置yml
若有多个配置必须每个配置中都添加上配置
aes:
key: xxxx
secret: xxxxxxx
5.第五步
若application.yml
和bootStrap.yml
在同一目录下,则bootStrap.yml的加载顺序要高于application.yml,如果当前配置文件名称为application.yml,即使配置文件中存在所使用的属性key,使用@Value注解也会报错,因为在启动项目时@Value只能检索到优先及最高的配置文件,也就是bootStrap.yml
原理:
- bootstrap.yml用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载。bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
- application.yml可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
补充:Spring Boot 项目中 @Value 注解失效问题
Spring Boot 项目中 @Value 注解失效问题
问题描述
在 Spring Boot 项目中,我们使用 @Value
注解从 application.yml
配置文件中注入配置值。但是,由于同事直接 new 创建了含有 @Value
注解的类实例,导致注解失效。
配置文件 application.yml
# ${service-model} 读取的是 pom.xml 文件中自定义的属性,可以直接定义,例如:test service-model: ${service-model}
实体类 Demo
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Slf4j @Component public class Demo { @Value("${service-model}") private String serviceModel; public void getValue() { System.out.println("serviceModel = " + serviceModel); } } // 输出结果为 null,因为 @Value 注解失效
处理逻辑
由于 @Value
注解失效,我们使用 SnakeYAML 库直接读取 yml
配置文件并获取配置信息。
导入依赖
<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.31</version> </dependency>
创建读取配置工具类 YamlUtil
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * 获取 YAML 配置文件参数 */ public class YamlUtil { public static Map<String, Object> getConfigInfo(String fileName) { Yaml yaml = new Yaml(new Constructor(Map.class)); Map<String, Object> config = new HashMap<>(); try (InputStream inputStream = YamlUtil.class.getClassLoader().getResourceAsStream(fileName)) { // 加载 YAML 文件 config = yaml.load(inputStream); } catch (Exception e) { e.printStackTrace(); } return config; } }
使用方法
import lombok.extern.slf4j.Slf4j; @Slf4j public class Demo { public void getValue() { Map<String, Object> configInfo = YamlUtil.getConfigInfo("application.yml"); String serviceModel = (String) configInfo.get("service-model"); System.out.println("serviceModel = " + serviceModel); } } // 输出结果为 "test",因为通过 YamlUtil 成功读取了配置文件
总结
通过上述步骤,我们解决了 @Value
注解失效的问题,并提供了一个替代方案来读取配置文件中的值。这样可以确保即使在 @Value
注解无法正常工作的情况下,也能正确地获取配置信息。
到此这篇关于SpringBoot中@Value注入失败问题解决步骤的文章就介绍到这了,更多相关SpringBoot @Value注入失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!