【SpringBoot】PropertySource注解获取yml取不到值
本帖最后由 夏橙M兮 于 2022-3-21 20:28 编辑我想从指定的配置文件里获取信息封装成bean,结果这个yml文件不行呀。创建的bean属性一直为空,前天晚上到今天还是找不出原因。感觉得放弃了。
求助一下大佬,我试了一下properties文件的bean是可以获取属性的,就yml这种格式不行。不知道为啥。
springboot版本是 (v2.5.1)
@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输出的值是空的。
@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是可以的。
@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 INFOcom.example.demo.controller.helloController - ConfigBeanSource,username:sourcetest,age:21,hobby:null是有值得 本帖最后由 sunwul 于 2022-3-13 01:11 编辑
夏橙M兮 发表于 2022-3-12 17:30
我是想PropertySource和ConfigurationProperties搭配起来使用,自动给bean赋值
你说的这种就是自动扫描自定义的配置文件,然后根据绑定的类生成Bean了. 这种只要实现PropertySourceFactory重写createPropertySource()方法. 扫描并装载指定路径下的配置文件就可以了.
[*]实现PropertySourceFactory 重写 createPropertySource() 方法
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);
}
}
[*]配置类
@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
}
[*]自定义配置文件
demo:
test:
name: sunwul
age: 99 https://blog.csdn.net/weixin_33912638/article/details/91475424这个给出了答案
综上分析可知,@PropertySource 注解读取属性文件的关键在于 PropertySourceFactory 接口中的 createPropertySource 方法,所以我们想要实现 @PropertySource 注解读取 yml 文件就需要实现 createPropertySource 方法,在 @PropertySource 注解其是通过 DefaultPropertySourceFactory 类来实现这个方法,我们只需要继承此类,并重写其 createPropertySource 方法即可,实现代码如下:
@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);
}
这是bootstratp.yml的值
config1:
info:
username1: sourcetest
age: 21
hobby: read 希望这个文章对你有帮助
https://www.cnblogs.com/guoyansi19900907/p/8809910.html Takitooru 发表于 2022-3-12 10:57
希望这个文章对你有帮助
https://www.cnblogs.com/guoyansi19900907/p/8809910.html
这个application.yml文件我是能获取的,我想知道一个别的名称的文件。{:1_937:} @PropertySource不支持加载yml树形结构的配置(但是yml中写成xx.xx.xx这样像properties的结构是支持的) sunwul 发表于 2022-3-12 12:09
@PropertySource不支持加载yml树形结构的配置(但是yml中写成xx.xx.xx这样像properties的结构是支持的)
应该是支持的。我单独用propertySource和value注解是可以的。 原理: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
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.在项目内通过@value()注解读取bootstrap内参数
二、需要将spring.cloud.bootstrap.enabled设为true(注意这个必须设为系统变量或者环境变量) 狒狒大魔王 发表于 2022-3-12 15:54
原理:bootstrap.yml默认不生效
官方文档有提到:https://docs.spring.io/spring-cloud/docs/2020.0.1/ref ...
学习了,果然还是要看官方文档啊,我英语太差了 狒狒大魔王 发表于 2022-3-12 15:54
原理:bootstrap.yml默认不生效
官方文档有提到:https://docs.spring.io/spring-cloud/docs/2020.0.1/ref ...
我是想PropertySource和ConfigurationProperties搭配起来使用,自动给bean赋值 用@Value("${config1.info.}") 的方式
页:
[1]
2