static类使用@Value获取yml文件获取不到的问题

背景:要在static的类中访问yml中的配置。直接在静态类中使用@Value是获取不到配置

解决方案:通过再工具类内部构造静态得setter方法,外部类进行调用。

1.yml定义

2.ServiceClass类,调用工具类的静态方法

public class ServiceClass {

    @Value("${fileFormatConfig.picture}")
    private String PICTURE_FORMAT;
    @Value("${fileFormatConfig.video}")
    private String VIDEO_FORMAT;
    @Value("${fileFormatConfig.audio}")
    private String AUDIO_FORMAT;

    public void startDetection() {
        //调用静态工具类
        TestUtils.init(PICTURE_FORMAT, VIDEO_FORMAT, AUDIO_FORMAT);
        TestUtils.originalTextDetection();
    }

}

3.Utils工具类

public class TestUtils {
    private static String PICTURE_FORMAT;
    private static String VIDEO_FORMAT;
    private static String AUDIO_FORMAT;

    // 静态setter,由外部类的某个方法(如@PostConstruct)调用
    public static void init(String pictureFormat, String videoFormat, String audioFormat) {
        PICTURE_FORMAT = pictureFormat;
        VIDEO_FORMAT = videoFormat;
        AUDIO_FORMAT = audioFormat;
    }

    public static void originalTextDetection() {
        System.out.println(PICTURE_FORMAT);
        System.out.println(VIDEO_FORMAT);
        System.out.println(AUDIO_FORMAT);
    }

}

### 解决 @Value 注解无法从 YAML 文件获取属性问题 在某些情况下,在 Spring Boot 中使用 `@Value` 注解读取 `application.yml` 或其他 `.yml` 配置文件中的属性可能会返回 `null` 。这通常是因为配置加载顺序或环境感知机制出现问题。 #### 使用 EnvironmentAware 接口替代 @Value 注解 一种可靠的解决方案是让自定义配置实现 `EnvironmentAware` 接口,从而能够直接访问应用程序上下文中已解析好的环境变量。这种方式绕过了可能存在的 `@Value` 注入失败问题: ```java import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class RedisConfig implements EnvironmentAware { private static final String REDIS_HOST_KEY = "spring.redis.host"; private String redisHost; @Override public void setEnvironment(Environment env) { this.redisHost = env.getProperty(REDIS_HOST_KEY); } public String getRedisHost() { return redisHost; } } ``` 这种方法利用了 `env.getProperty()` 函数来安全可靠地检索配置项[^2]。 #### 检查 ConfigurationProperties 的正确应用 另一种常见的做法是在实体上标注 `@ConfigurationProperties(prefix="spring.redis")` 来批量映射一组相关的配置键对至 JavaBean 属性中。需要注意的是,为了使此功能生效,还需要确保项目依赖里包含了必要的 starter 并启用了相应的自动装配支持。 对于上述提到的 Redis 连接信息案例而言,可以创建如下所示的一个 POJO 用于承载这些设置: ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "spring.redis") public class RedisSettings { private int database; private String host; // Getters and Setters... } ``` 这样做的好处是可以简化代码逻辑并提高可维护性的同时也解决了单个字段注入为空的情况[^1]。 #### 调试与验证 如果仍然遇到问题,建议开启日志调试模式以便观察框架内部是如何处理配置数据流的;另外也可以尝试打印出整个 `Environment` 对象的内容以确认目标 key 是否确实存在及其对应的 value 是什么样子。 最后提醒一点,务必保证所使用的占位符语法格式无误——即 `${key}` 形式的字符串模板才是被认可的标准写法[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值