java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot @Value注入失败

SpringBoot中@Value注入失败问题解决步骤

作者:待续301

本文给大家介绍SpringBoot中@Value注入失败问题解决步骤,本文分步骤结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

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.ymlbootStrap.yml在同一目录下,则bootStrap.yml的加载顺序要高于application.yml,如果当前配置文件名称为application.yml,即使配置文件中存在所使用的属性key,使用@Value注解也会报错,因为在启动项目时@Value只能检索到优先及最高的配置文件,也就是bootStrap.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注入失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文