吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1740|回复: 15
收起左侧

[已解决] 【SpringBoot】PropertySource注解获取yml取不到值

[复制链接]
夏橙M兮 发表于 2022-3-12 10:43
本帖最后由 夏橙M兮 于 2022-3-21 20:28 编辑

我想从指定的配置文件里获取信息封装成bean,结果这个yml文件不行呀。创建的bean属性一直为空,前天晚上到今天还是找不出原因。感觉得放弃了。
求助一下大佬,我试了一下properties文件的bean是可以获取属性的,就yml这种格式不行。不知道为啥。
springboot版本是 (v2.5.1)
[Java] 纯文本查看 复制代码
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "config1.info")
@PropertySource(value={"classpath:bootstrap.yml"})
public class ConfigBeanYmlSourceFit {
    private String username1;
    private String age;
    private String hobby;
}


com.example.demo.controller.helloController - ConfigBeanYmlSourceFit,username:null,age:null,hobby:null  输出的值是空的。
[Java] 纯文本查看 复制代码
@ConfigurationProperties(prefix = "demo")
@PropertySource(value={"classpath:demo.properties"},encoding="gbk")
public class ConfigBeanProperSourceFit {
    private String name;
    private String createdate;
    private String remark;
}

com.example.demo.controller.helloController - ConfigBeanProperSourceFit,name:propertiesName,createdate:20220312,remark:快点测试通吧  是有值得
我又试了一下只用PropertySource注解加value是可以的。
[Java] 纯文本查看 复制代码
@Getter
@Setter
@Component
@PropertySource(value={"classpath:bootstrap.yml"})
public class ConfigBeanSource {
    @Value("${username1}")
    private String username;
    @Value("${age}")
    private String age;
    private String hobby;
}

2022-03-12 10:31:26.281 [http-nio-8080-exec-1] INFO  com.example.demo.controller.helloController - ConfigBeanSource,username:sourcetest,age:21,hobby:null  是有值得

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sunwul 发表于 2022-3-13 01:06
本帖最后由 sunwul 于 2022-3-13 01:11 编辑
夏橙M兮 发表于 2022-3-12 17:30
我是想PropertySource和ConfigurationProperties搭配起来使用,自动给bean赋值

你说的这种就是自动扫描自定义的配置文件,然后根据绑定的类生成Bean了. 这种只要实现PropertySourceFactory重写createPropertySource()方法. 扫描并装载指定路径下的配置文件就可以了.
  • 实现  PropertySourceFactory 重写 createPropertySource() 方法
[Java] 纯文本查看 复制代码
public class YamlAuto implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String s, EncodedResource encodedResource) throws IOException {
        YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
        factoryBean.setResources(encodedResource.getResource()); // 指定资源路径
        factoryBean.afterPropertiesSet(); // 调用初始化方法装载配置文件
        Properties yml = factoryBean.getObject(); // 本质上还是转为 Properties
        s = encodedResource.getResource().getFilename(); // 配置文件名称
        return new PropertiesPropertySource(s, yml);
    }
}

  • 配置类

[Java] 纯文本查看 复制代码
@Component
@ConfigurationProperties(prefix = "demo.test")
// 指定自定义工厂, 要绑定的配置
@PropertySource(factory = YamlAuto.class, value = "classpath:demo.yml")
public class TestConfig {

    private String name;

    private String age;

    private String sex;

    private String phone;

    // 省略getter/setter
}

  • 自定义配置文件

[Java] 纯文本查看 复制代码
demo:
  test:
    name: sunwul
    age: 99

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
夏橙M兮 + 2 + 1 谢谢@Thanks!

查看全部评分

 楼主| 夏橙M兮 发表于 2022-3-21 20:26
https://blog.csdn.net/weixin_33912638/article/details/91475424  这个给出了答案
综上分析可知,@PropertySource 注解读取属性文件的关键在于 PropertySourceFactory 接口中的 createPropertySource 方法,所以我们想要实现 @PropertySource 注解读取 yml 文件就需要实现 createPropertySource 方法,在 @PropertySource 注解其是通过 DefaultPropertySourceFactory 类来实现这个方法,我们只需要继承此类,并重写其 createPropertySource 方法即可,实现代码如下:
[Java] 纯文本查看 复制代码
@Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        if (resource == null){
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        return sources.get(0);
    }
 楼主| 夏橙M兮 发表于 2022-3-12 10:45
这是bootstratp.yml的值
[Asm] 纯文本查看 复制代码
config1:
  info:
    username1: sourcetest
    age: 21
    hobby: read
Takitooru 发表于 2022-3-12 10:57

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
夏橙M兮 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 夏橙M兮 发表于 2022-3-12 11:13
Takitooru 发表于 2022-3-12 10:57
希望这个文章对你有帮助
https://www.cnblogs.com/guoyansi19900907/p/8809910.html

这个application.yml文件我是能获取的,我想知道一个别的名称的文件。
sunwul 发表于 2022-3-12 12:09
@PropertySource不支持加载yml树形结构的配置(但是yml中写成xx.xx.xx这样像properties的结构是支持的)
 楼主| 夏橙M兮 发表于 2022-3-12 15:33
sunwul 发表于 2022-3-12 12:09
@PropertySource不支持加载yml树形结构的配置(但是yml中写成xx.xx.xx这样像properties的结构是支持的)

应该是支持的。我单独用propertySource和value注解是可以的。
狒狒大魔王 发表于 2022-3-12 15:54
原理:bootstrap.yml默认不生效
官方文档有提到:https://docs.spring.io/spring-cloud/docs/2020.0.1/reference/htmlsingle/#config-first-bootstrap
To use the legacy bootstrap way of connecting to Config Server,bootstrap must be enabled via a property or the spring-cloud-starter-bootstrap starter.The property is spring.cloud.bootstrap.enabled=true. It must be set as a System Property or environment variable.

两种方法
一、1.在pom文件内引入maven
[XML] 纯文本查看 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

2.在项目内通过@value()注解读取bootstrap内参数
二、需要将spring.cloud.bootstrap.enabled设为true(注意这个必须设为系统变量或者环境变量)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
夏橙M兮 + 1 + 1 谢谢@Thanks!

查看全部评分

1024A1024 发表于 2022-3-12 16:46
狒狒大魔王 发表于 2022-3-12 15:54
原理:bootstrap.yml默认不生效
官方文档有提到:https://docs.spring.io/spring-cloud/docs/2020.0.1/ref ...

学习了,果然还是要看官方文档啊,我英语太差了
 楼主| 夏橙M兮 发表于 2022-3-12 17:30
狒狒大魔王 发表于 2022-3-12 15:54
原理:bootstrap.yml默认不生效
官方文档有提到:https://docs.spring.io/spring-cloud/docs/2020.0.1/ref ...

我是想PropertySource和ConfigurationProperties搭配起来使用,自动给bean赋值
gebiafu 发表于 2022-3-12 18:30
用@Value("${config1.info.}") 的方式
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表