Java SpringBoot 加载 yml 配置文件中字典项

实际项目中,如果将该类信息放配置文件中的话,一般会结合Nocas一起使用
将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中
Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resources)下新建application-xxx

 

必须以application开头的yml文件, 多个文件用 "," 号分隔,不能换行

项目结构文件 

image

application.yml

server:port: 8088application: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 Processor
org.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> T bindProperties(String prefix, Class<T> clazz) {Assert.notNull(prefix, "prefix 不能为空");Assert.notNull(clazz, "class 不能为空");BindResult<T> result = ConfigUtil.binder.bind(prefix, clazz);return result.isBound() ? result.get() : null;}/*** 通过 META-INF/spring.factories,触发该方法的执行,进行环境变量的加载*/@Overridepublic 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;@RestController
public class DefaultController {@GetMapping(value = "/")public String login() {return "VipSoft Demo !!!";}@GetMapping("/list/{type}")public List<DictVO> listDic(@PathVariable("type") String type) {LinkedHashMap dict = ConfigUtil.bindProperties(type.replaceAll("_", "-"), LinkedHashMap.class);List<DictVO> list = new ArrayList<>();if (dict == null || dict.isEmpty()) {return list;}dict.forEach((key, value) -> list.add(new DictVO(key.toString(), value.toString())));return list;}
}

运行效果

image

单元测试

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;@SpringBootTest
public class DicTest {@AutowiredDefaultController defaultController;@Testpublic void DicListTest() throws Exception {List<DictVO> pay_type = defaultController.listDic("pay-type");pay_type.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));List<DictVO> user_gender = defaultController.listDic("user-gender");user_gender.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));}@Testpublic void getString() throws Exception {String includeYml = ConfigUtil.getString("spring.profiles.include");System.out.println("application 引用了配置文件 =》 " + includeYml);}
}

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/87491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ajax-概念、Http协议、Ajax请求及其常见问题

Ajax Ajax概念Ajax优缺点HTTP协议请求报文响应报文 Ajax案例准备工作express基本使用创建一个服务器 发送AJAX请求GET请求POST请求JSON响应 Ajax请求出现的问题IE缓存问题Ajax请求超时与网络异常处理Ajax手动取消请求Ajax重复发送请求问题 Ajax概念 AJAX 全称为Asynchronous J…

Maven从入门到好难

参考文献 永远最好的官网 超赞maven系列文章 1. 为啥要有maven 想当初&#xff0c;刚毕业刚工作&#xff0c;之前学的C&#xff0c;java不懂&#xff0c;部门用的Spring&#xff0c;于是开始学习SSM&#xff0c;妈的&#xff0c;jar包好难整&#xff0c;还要一个个下载好放到…

腾讯云服务器标准型CVM实例详细介绍S5/S6/SA2/SR1/SA3/S4等

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…

HCIP BGP实验

题目 拓扑图 配置IP地址及环回 R1 <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24R2 <Huawei>sy Enter …

AI lightning学习

真的是没有mmlab的框架好理解&#xff0c;hook调用没问题&#xff0c;就是代码写的不整洁&#xff0c;hook放的到处都是&#xff0c;而且hook的名字和run的名字也不好对应。 又是捧mmengine的一天 &#x1f603;

2023国赛数学建模A题B题C题D题E题思路分析 2023全国大学生数学建模思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

jupyter文档转换成markdown

背景 上一篇文章**《如何优雅地用python生成模拟数据》**我就使用jupyter写的&#xff0c;这个真的是万能的&#xff0c;可以插入markdown格式的内容&#xff0c;也可写代码&#xff0c;关键是像ipython一样&#xff0c;可以分步执行。 我可以这样自由的写我的博客内容&#x…

div 中元素居中的N种常用方法

本文主要记录几种常用的div盒子水平垂直都居中的方法。本文主要参考了该篇博文并实践加以记录说明以加深理解记忆 css之div盒子居中常用方法大全 本文例子使用的 html body结构下的div 盒子模型如下&#xff1a; <body><div class"container"><div c…

论文阅读:《Waymo Public Road Safety Performance Data》

文章目录 1 背景2 方法2.1 数据来源2.2 碰撞数据 3 碰撞事件分析4 讨论 1 背景 这篇文章是讲waymo道路安全性能数据分析的&#xff0c;主要想表达的是waymo自动驾驶系统在安全上面的出色表现&#xff0c;以向政府、大众提高自己产品的公信力。 这篇文章分析的数据是自从2019年到…

备战秋招012(20230808)

文章目录 前言一、今天学习了什么&#xff1f;二、动态规划1.概念2.题目 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 提示&#xff1a;以下是本篇文章正文…

Vue主面板组件模板(简洁版)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言&#xff1a; 本篇博客主要以介绍【&#x1f380;主面板组件模板&#xf…

【计算机视觉|生成对抗】用深度卷积生成对抗网络进行无监督表示学习(DCGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 链接&#xff1a;[1511.06434] Unsupervised Representation Learning with Deep Conv…

Webpack 的 sass-loader 在生产模式下最小化 CSS 问题

学习webpack时候我发现一个问题&#xff1a; 将mode 改为production模式后&#xff0c;生成的css会被压缩了&#xff0c;但是我并没有引入CssMinimizerPlugin插件&#xff0c;然后我试着将optimization.minimize 设置为false&#xff0c;测试是否为webpack自带的压缩&#xff0…

设备工单管理系统如何实现工单流程自动化?

设备工单管理系统属于工单系统的一种&#xff0c;基于其丰富的功能&#xff0c;它可以同时处理不同的多组流程&#xff0c;旨在有效处理发起人提交的事情&#xff0c;指派相应人员完成服务请求和记录全流程。该系统主要面向后勤管理、设备维护、物业管理、酒店民宿等服务行业设…

九、解析应用程序——分析应用程序(2)

文章目录 一、确定服务器端功能二、解析受攻击面 一、确定服务器端功能 通过留意应用程序向客户端披露的线索&#xff0c;通常可推断与服务器端功能和结构有关的大量信息&#xff0c;或者至少可做出有根据的猜测。以下面用于访问搜索功能的URL为例: 可见&#xff0c;.jsp文件扩…

选择最适合自己的笔记本

选择最适合自己的笔记本电脑 一、了解笔记本品牌一线品牌准一线品牌二线品牌三线品牌 二、笔记本入手渠道笔记本入手渠道 三、根据需求选择机型使用需求1.日常使用2.商务办公、财务3.轻度剪辑、ps4.代码5.创意设计6.游戏 四、笔记本电脑配置如何选1.cpu2.显卡&#xff08;GPU&a…

数据结构:力扣OJ题

目录 ​编辑题一&#xff1a;链表分割 思路一&#xff1a; 题二&#xff1a;相交链表 思路一&#xff1a; 题三&#xff1a;环形链表 思路一&#xff1a; 题四&#xff1a;链表的回文结构 思路一&#xff1a; 链表反转&#xff1a; 查找中间节点&#xff1a; 本人实力…

数字鸿沟,让气候脆弱者更脆弱

“从小到大完全没敢想&#xff0c;也觉得是不可思议的一件事儿&#xff0c;发洪水发到家门口了”&#xff0c;前两天&#xff0c;一位门头沟土著友人&#xff0c;给我发来了这句话。 气候变化正在影响整个地球&#xff0c;面对一连串前所未见的极端天气灾害&#xff0c;很多人应…

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别

协议的不同&#xff0c;数据读取困难&#xff0c;这是很多生产管理系统的难题。但是现在&#xff0c;捷米JM-CCLKIE-TCP通讯网关&#xff0c;让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中&#xff0c;连接到MODBUS-TCP总线…

运营商加速抢占云计算,5G带来更多利润,上半年躺赚近千亿

中国移动已率先公布了上半年的业绩&#xff0c;业绩显示它们正在加速抢占此前由互联网企业占据优势的云计算市场&#xff0c;不过最让它们开心的还是5G继续带动利润的高速增长&#xff0c;预计三大运营商今年上半年可以躺赚近千亿元。 中国移动无疑仍然是运营商行业的领头羊&am…