Java SpringBoot 加载 yml 配置文件中字典项
将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resources)下新建application-xxx
必须以application开头的yml文件, 多个文件用 "," 号分隔,不能换行
(资料图片仅供参考)
项目结构文件
application.yml
server: port: 8088 application: name: VipSoft Env Demospring: profiles: include: dic # 在配置文件目录(如:resources)下新建application-xxx 开头的yml文件, 多个文件用 "," 号分隔,不能换行#性别字典user-gender: 0: 未知 1: 男 2: 女
application-dic.yml将字典独立到单独的yml文件中
#支付方式pay-type: 1: 微信支付 2: 货到付款
在 resources
目录下,创建META-INF
目录,创建 spring.factories
文件,Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。内容如下:
# Environment Post Processororg.springframework.boot.env.EnvironmentPostProcessor=com.vipsoft.web.utils.ConfigUtil
ConfigUtil
package com.vipsoft.web.utils;import org.springframework.boot.SpringApplication;import org.springframework.boot.context.properties.bind.BindResult;import org.springframework.boot.context.properties.bind.Binder;import org.springframework.boot.env.EnvironmentPostProcessor;import org.springframework.core.env.ConfigurableEnvironment;import org.springframework.core.env.PropertySource;import org.springframework.util.Assert;public class ConfigUtil implements EnvironmentPostProcessor { private static Binder binder; private static ConfigurableEnvironment environment; public static String getString(String key) { Assert.notNull(environment, "environment 还未初始化!"); return environment.getProperty(key, String.class, ""); } public static T bindProperties(String prefix, Class clazz) { Assert.notNull(prefix, "prefix 不能为空"); Assert.notNull(clazz, "class 不能为空"); BindResult result = ConfigUtil.binder.bind(prefix, clazz); return result.isBound() ? result.get() : null; } /** * 通过 META-INF/spring.factories,触发该方法的执行,进行环境变量的加载 */ @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { for (PropertySource> propertySource : environment.getPropertySources()) { if (propertySource.getName().equals("refreshArgs")) { return; } } ConfigUtil.environment = environment; ConfigUtil.binder = Binder.get(environment); }}
DictVo
package com.vipsoft.web.vo;public class DictVO implements java.io.Serializable { private static final long serialVersionUID = 379963436836338904L; /** * 字典类型 */ private String type; /** * 字典编码 */ private String code; /** * 字典值 */ private String value; public DictVO(String code, String value) { this.code = code; this.value = value; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getValue() { return value; } public void setValue(String value) { this.value = value; }}
DefaultController
package com.vipsoft.web.controller;import com.vipsoft.web.utils.ConfigUtil;import com.vipsoft.web.vo.DictVO;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;@RestControllerpublic class DefaultController { @GetMapping(value = "/") public String login() { return "VipSoft Demo !!!"; } @GetMapping("/list/{type}") public List listDic(@PathVariable("type") String type) { LinkedHashMap dict = ConfigUtil.bindProperties(type.replaceAll("_", "-"), LinkedHashMap.class); List list = new ArrayList<>(); if (dict == null || dict.isEmpty()) { return list; } dict.forEach((key, value) -> list.add(new DictVO(key.toString(), value.toString()))); return list; }}
运行效果
单元测试
package com.vipsoft.web;import com.vipsoft.web.controller.DefaultController;import com.vipsoft.web.utils.ConfigUtil;import com.vipsoft.web.vo.DictVO;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTestpublic class DicTest { @Autowired DefaultController defaultController; @Test public void DicListTest() throws Exception { List pay_type = defaultController.listDic("pay-type"); pay_type.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue())); List user_gender = defaultController.listDic("user-gender"); user_gender.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue())); } @Test public void getString() throws Exception { String includeYml = ConfigUtil.getString("spring.profiles.include"); System.out.println("application 引用了配置文件 =》 " + includeYml); }}
关键词:
责任编辑:宋璟
-
白银短线突发急涨行情!白银日内交易分析:若突破首个目标 银价有望再飙升逾3%|全球速递
-
PPT | 退役风电机组回收利用与碳减排
-
优化营商环境 多听企业意见(经济时评)|当前观点
-
2023浙江金华市武义县各级机关单位考试录用公务员拟录用人员公示(二)
-
邹越演讲观后感200字(邹越演讲观后感)
-
力争零售总额突破2万亿元 湖南出台促消费政策最高补贴1000万元
-
天天报道:乘舟向天宫!中国空间站应用与发展阶段任务拉开序幕
-
《自然》发表首个人类泛基因组草图,更完整描绘遗传多样性-当前头条
-
天天快看点丨揭秘 发射前6小时“赶飞船”
-
卡西欧标准差_卡西欧计算器算标准差
-
华新水泥(06655.HK):5月10日南向资金增持10.84万股
-
当前头条:魏国秋_关于魏国秋简述
-
蒙蒂:今天掘金一直包夹布克和杜兰特 我们在进攻端没有足够产出-环球快看
-
环球快资讯:中超-巴顿远射破门王子铭救主明天染红 国安1-1十人天津
-
牛年古诗有哪些 关于牛年的古诗大全
-
世界热议:成都幼儿园线上报名人数太多可以换一个吗2023?
-
42647辆!比亚迪秦登顶4月轿车销量排行榜!-每日信息
-
经营活动产生的现金流量净额为负数怎么调整 经营活动产生的现金流量净额为负
-
文字技巧—隐藏的分隔符怎么删除
-
环球热点评!吴诚博士 吴诚真书画价格
-
什么是网络男神_什么是网络设备 全球实时
-
2023北京未来砚园共有产权房申购指南(时间+官网)-消息
-
世界滚动:天舟六号,今晚发射!
-
造价员和预算员的区别 请详细点(造价员和预算员的区别是什么)|前沿热点
-
全球焦点!晚间公布美国4月CPI数据 黄金高位盘整
-
热点!行业首个健康营养展NHNE(2023春)于青岛盛大开幕!
-
施时楷_关于施时楷介绍 天天微资讯
-
今日热搜:“码”上监管 惠企便民——石家庄市大力优化营商环境进行时之二
-
今年618视频号先卷为敬
-
世界微动态丨华宝新能董秘回复:目前,公司率先发布了免安装、中小型容量的移动式家庭储能产品,并实现了快速增长
-
今日视点:5月10日燃料电池板块涨幅达2%
-
天天速讯:2023年广西高考第二次征集志愿12月24日开始填报
-
世界今日报丨每天吃一盒蓝莓会发生什么?皮肤真的会变白?视力真的会变好?
-
世界热点评!青岛崂山区拟于5月30日出让1宗商住地 起价17.14亿元
-
用心用情保护传统村落文化遗产-环球快资讯