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


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

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

    项目结构文件
    image

    application.yml

    server:
      port: 8088
      application:
        name: VipSoft Env Demo
    
    
    spring:
      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 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;
    
    
    @RestController
    public 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;
        }
    }
    
    

    运行效果
    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 {
        @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);
        }
    }
    
    

    image

  • 相关阅读:
    数据结构和算法笔记1:滑动窗口
    cuda,显卡,pytorch三者配置相关知识--学习笔记
    121. 一键部署开箱即用的代理服务器,解决 SAP UI5 应用开发过程中访问远端 OData 服务的跨域问题
    python / pyside6 + pymysql 实现简单的个人资金管理系统
    Java Spring后处理器
    Tomcat7+ 弱口令 && 后台getshell漏洞
    【数之道 05】走进神经网络模型、机器学习的世界
    深入理解 Spring 的事件机制
    数据库用户管理
    三、python Django ORM操作数据库[命令、postgresql操作]
  • 原文地址:https://www.cnblogs.com/vipsoft/p/17332858.html