使用@ConfigurationProperties注解获取为null的问题

本文解决了一个Spring Boot应用中通过get方法获取配置属性值为空的问题。作者最初尝试引入依赖和调整YAML配置格式,但未能解决问题。最终发现set方法不应被static修饰,移除static关键字后成功获取到了配置值。

一、问题描述

通过get方法去取值一直为null。代码如下:

@Component
@ConfigurationProperties(prefix = "file")
public class ServiceConfig {

    /**
     * windows上传路径
     */
    private static String winUploadPath;

    public static String getWinUploadPath() {
        return winUploadPath;
    }

    public static void setWinUploadPath(String winUploadPath) {
        ServiceConfig.winUploadPath = winUploadPath;
    }
}

application.yml配置:

file:
  winUploadPath: D:/opt/tongue/uploadPath

二、解决过程

过程一

刚开始一直ide弹这个框,以为是这个问题。
在这里插入图片描述
然后搜了资料,有的说下面依赖是生成配置元信息,不引入yml文件就失效了

于是引入之后并没有效果!!!

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
</dependency>

过程二

不要在application.yml/properties文件中使用camel大小写。尽量用-分割。
我看了一下原生框架的配置,发现人家确实没大小写,于是改了仍然没有用。

过程三(成功解决!)

因为想的是直接获取属性,所以都是设置的static,包括set方法。于是set方法去除掉static后 成功解决。

三、总结

set方法被static 修饰无法获取到值!!!

不过尽量咱们也规范点不要在application当中区分大小写,尽量用- 。
用横杠的话,其实在java文件当中,他是会自动转换的。

我最终改成了这样,发现在java文件当中的winUploadPath属性照样可以读到值。

file:
  win-upload-path: D:/opt/tongue/uploadPath

还有要注意的就是一定要有get、set方法,没有貌似也读不了值的。

### @Value 和 @ConfigurationProperties 的五个主要区别 #### 1. **功能定位** - `@Value` 主要用于直接注入单个配置项的,适合简单的场景。它通常针对单独的属性进行操作[^2]。 - `@ConfigurationProperties` 则专注于将一组相关的配置绑定到一个 Java Bean 上,支持复杂的数据结构(如 Map、List 等),更适合大规模配置管理[^4]。 #### 2. **松散绑定与类型转换** - 使用 `@Value` 注解时,不支持松散绑定,这意味着配置项的名字必须严格匹配。例如,如果配置名为 `my-property`,则无法自动映射到驼峰命名法下的 `myProperty` 属性中[^3]。 - 而 `@ConfigurationProperties` 支持松散绑定,允许使用不同的命名风格(如 `-` 或 `_` 分隔符)以及大小写无关的方式绑定配置[^1]。 #### 3. **默认的支持** - 当使用 `@Value` 注入配置时,默认情况下如果没有找到对应的配置键,则会抛出异常。不过可以通过 `${key:default}` 提供默认来规避此问题[^2]。 - 对于 `@ConfigurationProperties` 来说,在未定义某些配置的情况下,Spring 容器会尝试初始化这些字段为其类型的默认(对于引用类型为 null,基本数据类型为零等)。因此无需显式设定默认即可正常运行程序[^3]。 #### 4. **验证机制** - `@Value` 并不具备内置的校验能力,开发者需自行实现业务逻辑判断所获取的有效性[^4]。 - 在另一方面,借助 JSR-303 标准约束注解(比如 `@NotNull`, `@Min`, etc.), 我们可以在基于 `@ConfigurationProperties` 开发的应用里轻松完成参数合法性检测工作[^1]。 #### 5. **性能考量** - 每次调用 `@Value` 都可能重新解析 SpEL 表达式或者查找环境变量,这可能会带来一定的开销特别是当频繁访问同一配置的时候[^2]。 - 相较之下,`@ConfigurationProperties` 是在应用启动阶段一次性加载所有的相关联配置并缓存起来,后续只需从内存读取已有的对象实例即可,从而提高了效率。 ```java // 示例代码展示两者的不同之处 @ConfigurationProperties(prefix = "app.config") public class AppConfig { private String name; private Integer timeout; // Getters and Setters omitted for brevity. } @Component public class MyService { @Value("${app.config.name}") private String configName; @Autowired private AppConfig appConfig; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值