希望获取类似下面配置的student这个map
class:
student:
name:bob
number:12213550
gender:male
通过@ConfigurationProperties可以正常加载这种结构的map,但是通过Enviroment.getProperties()却只能获取到null。网上看到它们底层还都是一样的,是真的吗?
如何过Enviroment.getProperties()获取到yml中配置的map结构数据呢?
尝试过使用TypeReference,但是公司的SpringBoot版本比较低没有这个类。
参考GPT和自己的思路:关于如何通过Enviroment对象解析yaml中的map对象,其实是可以的。Enviroment对象提供了一个getProperty方法,参数是字符串类型的key,返回值是Object类型的value。在yaml中,map类型的数据对应的就是一个Object对象,所以我们可以通过getProperty方法得到这个Object对象,接着使用强制类型转换即可得到具体的map对象。具体的代码如下:
Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) env.getProperty("class.student");
这段代码的作用是获取名为"student"的map对象。需要注意的是,在yaml文件中,这个map对象是属于"class"这个对象下面的一级对象,所以在getProperty方法中,需要使用"class.student"这个字符串作为key。
参考GPT和自己的思路:Enviroment.getProperties()方法是用来获取系统环境变量和Java系统属性的,无法直接获取yaml中的map对象数据。如果需要获取yaml中的map对象数据,需要借助其他工具类来进行解析,比如使用SnakeYaml库。具体实现可以参照以下代码:
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Map;
public class YamlUtils {
public static Map<String, Object> getYamlMap(String yamlPath) {
Yaml yaml = new Yaml();
InputStream inputStream = YamlUtils.class.getClassLoader().getResourceAsStream(yamlPath);
Map<String, Object> obj = yaml.load(inputStream);
return obj;
}
}
在代码中,我们使用Yaml库的load方法来读取yaml文件,并将读取到的map对象返回。其中,yamlPath参数需要根据实际情况进行修改。
使用以上代码可以解决问题。同时,对于低版本的SpringBoot,可以自行添加snakeyaml库来实现类似的功能。