当前位置: 首页 > news >正文

Java 解析配置文件注入到配置类属性中供全局使用【开发记录】

1、背景:假设目前有两个接口,一个是查询快递订单状态的JSF接口,一个是查询快运订单状态的JSF接口,现有一个需求,要将这两个接口统一为一个入口,发布到物流开放平台供外界调用。

注意:以下代码均为示例代码,仅供参考,具体值均无任何业务含义。

2、实现:将两个原有JSF接口所有入参和出参做融合,并增加一个业务属性shunt做区分,根据shunt来判断是快递的查询业务还是快运的查询业务,然后底层调用原有的JSF接口,但是目前有一个问题是,物流开放平台对外返回的code码是一套标准的code码,而后端底层接口返回的code码则不符合平台标准,所以要将JSF接口返回code码和物流开放平台的code码做映射,以便符合物流开放平台的标准。

3、分析实现方式,做映射的解决方案有很多:

1)枚举类:增加一个枚举类,增加三个属性,分别是JSF接口返回的code,和物流开放平台的code,以及业务标识(供后端接口返回的code相等但是对应的平台code不同时使用)并提供传入JSF接口code获取平台code的方法供全局调用,这样有一个弊端,就是一旦有新增的code码就要重新修改代码重新上线。

package com.xx.xxxxxx.constant;/*** 融合映射状态码*/
public enum OrderCodeEnum {/*** bizCode 1 通用下单业务码*/ORDER_CODE_2202(2202, 1000002, 1),ORDER_CODE_2204(2204, 1000004, 1),ORDER_CODE_2225(2225, 1000025, 1),ORDER_CODE_2290(2290, 1000090, 1),ORDER_CODE_2291(2291, 1000091, 1);/*** JSF接口code*/private Integer code;/*** 物流开放平台code*/private Integer platformCode;/*** 业务标识*/private Integer bizCode;OrderCodeEnum(Integer code, Integer platformCode, Integer bizCode) {this.code = code;this.platformCode = platformCode;this.bizCode = bizCode;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public Integer getPlatformCode() {return platformCode;}public void setPlatformCode(Integer platformCode) {this.platformCode = platformCode;}public Integer getBizCode() {return bizCode;}public void setBizCode(Integer bizCode) {this.bizCode = bizCode;}/*** 根据JSF code获取平台code* @param bizCode 业务标识* @param code JSF code* @return 平台code*/public static Integer getValue(Integer bizCode, Integer code) {OrderCodeEnum[] orderCodeEnums = values();for (OrderCodeEnum orderCodeEnum : orderCodeEnums) {if (!orderCodeEnum.bizCode.equals(bizCode)) {continue;}if(!orderCodeEnum.code.equals(code)) {continue;}return orderCodeEnum.getPlatformCode();}return null;}
}

2)ducc配置(配置类):在ducc的配置类中新增一个属性,然后将JSF接口code和平台code映射关系配置到配置文件或ducc配置平台,在类加载的时候,set注入到配置类的该属性中供全局使用,这样后续添加新映射关系的时候可以通过修改配置文件或者ducc平台配置即可,这样是一个很好的解决方案,但是有一个弊端,当映射关系特别多的时候,由于配置的是一个字符串,后续增加可能会配置错误导致解析失败,还有可能长度超出限制。

具体如何添加参考文章:将配置读注入到配置类的属性中供全局使用【开发记录】

3)这也是本篇的核心:解析配置文件注入到配置类属性中供全局使用,优点:解析的配置文件的格式很清晰,一目了然后续扩展不会配置错误,没有长度限制,后续扩展无需修改代码,配置类提供静态方法一键调用,避免每次还要依赖注入配置类再进行调用。

添加orderCode-config.json配置文件

{"1000":"1000","2000":"2000","2001":"2001","2002":"2002","3000":"4000","4000":"4000","1000000":"2400","1000001":"2401","1000002":"2402","1000003":"2403","1000004":"2404","1000005":"2405","1000006":"2406"
}

增加配置类,并解析配置文件,注入到属性中:

package com.xx.xxxxxxx.config;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.xx.xxxxxxx.util.JsonFileLoadUtil;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;/*** 接口返回状态码和物流开放平台对外状态码映射* @author chenhongliang* @date 2023.03.17 15:00:00* @version 1.0*/@Component
public class OrderCodeConfig {private static final Logger logger = LoggerFactory.getLogger(OrderCodeConfig.class);/*** key:后端的code码* value:物流开放平台标准的platformCode*/private final static Map<String, String> orderCodeMap = new HashMap<>();@PostConstructprivate void init() {String jsonStrByFile = JsonFileLoadUtil.getJsonStrByFile("orderCode-config.json");Map<String, String> tempMap = JSON.parseObject(jsonStrByFile, new TypeReference<Map<String, String>>() {});if (!CollectionUtils.isEmpty(tempMap)) {orderCodeMap.putAll(tempMap);}logger.info("加载配置文件完成 key size:{}", orderCodeMap.size());}/*** 通过后端接口返回的code码获取物流开放平台标准的platformCode* @param code 接口返回的code* @return 物流开放平台标准的platformCode*/public static String getByCode(String code) {if(StringUtils.isBlank(code) || MapUtils.isEmpty(orderCodeMap)) {return StringUtils.EMPTY;}return orderCodeMap.get(code);}
}

至此可以通过静态方法getByCode,根据JSF接口code获取平台标准code。

贴一下相关Util代码:

package com.xx.xxxxxxx.util;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils;import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;public class JsonFileLoadUtil {private static final Logger LOGGER = LoggerFactory.getLogger(JsonFileLoadUtil.class);private JsonFileLoadUtil() {throw new IllegalStateException("Utility class");}/*** 读取json文件内容转为json字符串* @param jsonFileName json文件名* @return*/public static String getJsonStrByFile(String jsonFileName) {String jsonStr = "{}";try (InputStream inputStream = JsonFileLoadUtil.class.getClassLoader().getResourceAsStream(jsonFileName);) {jsonStr = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);} catch (IOException e) {LOGGER.error("未加载到配置文件:{}", jsonFileName);}LOGGER.info("读取JSON配置文件完成:jsonFileName{}, jsonStr:{}", jsonFileName, jsonStr);return jsonStr;}
}

相关文章:

Java 解析配置文件注入到配置类属性中供全局使用【开发记录】

1、背景&#xff1a;假设目前有两个接口&#xff0c;一个是查询快递订单状态的JSF接口&#xff0c;一个是查询快运订单状态的JSF接口&#xff0c;现有一个需求&#xff0c;要将这两个接口统一为一个入口&#xff0c;发布到物流开放平台供外界调用。 注意&#xff1a;以下代码均…...

【Python开发手册】深入剖析Google Python开发规范:规范Python注释写作

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland) (github.com)&…...

Python入门教程+项目实战-9.3节: 字符串的操作方法

目录 9.3.1 字符串常用操作方法 9.3.2 获取字符串长度 9.3.3 字符串的大小写操作 9.3.4 删除字符串中的空白字符 9.3.5 字符串的子串查找 9.3.6 字符串的子串统计 9.3.7 字符串的子串替换 9.3.8 字符串的拆分函数 9.3.9 字符串的前缀与后缀9.3.10 知识要点 9.3.11 系…...

ENVI 5.6软件安装教程

软件下载 [软件名称]&#xff1a;ENVI 5.6 [软件大小]&#xff1a;3.25G [安装环境]&#xff1a;Win7~Win11或更高 软件介绍 ENVI 5.6是一款实现遥感图像处理的工具&#xff0c;已经广泛应用于科研、环境保护、气象、石油矿产勘探、农业、林业、医学、地球科学、公用设施管…...

在Windbg中设置断点追踪打开C++程序远程调试开关的模块

目录 1、Windbg动态调试 2、在Windbg中设置断点 2.1、在函数入口处设置断点 2.2、在函数内部某一行上设置断点 3、设置断点跟踪对打开远程调试开关接口的调用 3.1、编写演示代码 3.2、在Windbg中设置调用SetRemoteDebugOn接口的断点进行跟踪 4、最后 VC常用功能开发汇总…...

CRM客户管理软件开发功能有哪些?

互联网技术的不断提高使得企业管理方式也发生了变化&#xff0c;企业CRM系统应用市场逐渐扩大&#xff0c;相关软件开发也引起越来越多商家企业的关注。因为企业CRM系统软件开发能够根据企业需求制作&#xff0c;帮助企业更好的追踪管理客户信息&#xff0c;实时更新并进行相关…...

C++函数式魔法之旅(Journey of Functional Magic)

C函数式魔法之旅&#xff08;Journey of Functional Magic&#xff09; 一、引言&#xff08;Introduction&#xff09;C Functional模板库简介&#xff08;Overview of C Functional Template Library&#xff09;Functional模板库的重要性和作用&#xff08;The Importance a…...

Vue基础入门(上)

<script src"https://unpkg.com/vuenext"></script> 从面向dom编程到面向数据编程 输入显示列表 const appVue.createApp({data(){return{inputValue:,list:[]}},methods:{handleAddItem(){this.list.push(this.inputValue);this.inputValue;}},templ…...

字符串匹配—KMP算法

字符串匹配的应用非常广泛&#xff0c;例如在搜索引擎中&#xff0c;我们通过键入一些关键字就可以得到相关的搜索结果&#xff0c;搜索引擎在这个过程中就使用字符串匹配算法&#xff0c;它通过在资源中匹配关键字&#xff0c;最后给出符合条件的搜索结果。并且我们在使用计算…...

【微信小程序】 权限接口梳理以及代码实现

​ 1、权限接口说明 官方权限说明   部分接口需要经过用户授权统一才能调用。我们把这些接口按使用范围分成多个scope&#xff0c;用户选择对scope进行授权&#xff0c;当授权给一个scope之后&#xff0c;其对应的所有接口都可以直接使用。 此类接口调用时&#xff1a; 如…...

【每日一词】leit-motif

1、释义 leit-motif: n. 主乐调&#xff1b;主题&#xff1b;主旨。 复数&#xff1a;leit-motifs 2、例句 Hence the ‘ancient’ rhyme that appears as the leit-motif of The Lord of the Rings, Three Rings for the Elven-Kings under the sky, Seven for the Dwarf-lor…...

windows 环境修改 Docker 存储目录

windows 环境修改存储目录 docker 安装时不提供指定安装路径和数据存储路径的选项&#xff0c;且默认是安装在C盘的。C盘比较小的&#xff0c;等docker运行久了&#xff0c;一大堆的东西放在上面容易导致磁盘爆掉。所以安装前可以做些准备&#xff0c;让安装的实际路径不在C盘&…...

上海市青少年算法月赛丙组—目录汇总

上海市青少年算法2023年3月月赛&#xff08;丙组&#xff09; T1 神奇的字母序列 T2 约数的分类 T3 循环播放 T4 数对的个数 T5 选取子段 上海市青少年算法2023年2月月赛&#xff08;丙组&#xff09; T1 格式改写 T2 倍数统计 T3 区间的并 T4 平分数字&#xff08;一&#xf…...

手动实现promise.all

手动实现promise.all function promiseAll(promises) {return new Promise((resolve, reject) > {const results [];let count 0;promises.forEach((promise, index) > {Promise.resolve(promise).then(result > {results[index] result;count;if (count promise…...

如何搭建关键字驱动自动化测试框架?这绝对是全网天花板的教程

目录 1. 关键字驱动自动化测试介绍 2. 搭建关键字驱动自动化测试框架 步骤1&#xff1a;选择测试工具 步骤2&#xff1a;定义测试用例 步骤3&#xff1a;编写测试驱动引擎 步骤4&#xff1a;实现测试关键字库 步骤5&#xff1a;执行测试 3. 实现关键字驱动自动化测试的关…...

字符串反转操作

1:将字符串反转 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母…...

TensorFlow 智能移动项目:1~5

原文&#xff1a;Intelligent mobile projects with TensorFlow 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只…...

[MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条

文章目录 关于图形绘制创建自定义控件使用控件创建专辑封面项目地址 我们将绘制一个圆形的音乐播放控件&#xff0c;它包含一个圆形的进度条、专辑页面和播放按钮。 关于图形绘制 使用MAUI的绘制功能&#xff0c;需要Microsoft.Maui.Graphics库。 Microsoft.Maui.Graphics 是…...

web路径专题+会话技术

目录 自定义快捷键 1. 工程路径问题及解决方案1.1 相对路径1.2 相对路径缺点1.3 base标签1.4 作业11.5 作业21.6注意细节1.7 重定向作业1.8 web工程路径优化 2. Cookie技术2.1 Cookie简单示意图2.2 Cookie常用方法2.2 Cookie创建2.3 Cookie读取2.3.1 JSESSIONID2.3.2 读取指定C…...

Jetpack Compose 实战 宝可梦图鉴

文章目录 前言实现效果一、架构介绍二、一些的功能点的介绍加载图片并获取主色,再讲主色设置为背景一个进度缓慢增加的圆形进度条单Activity使用navigation跳转Compose可组合项返回时页面重组的问题hiltViewModel() 主要参考项目总结 前言 阅读本文需要一定compose基础&#x…...

深入解析DW_I2C驱动中的中断处理机制:从FIFO到数据传输实战

深入解析DW_I2C驱动中的中断处理机制&#xff1a;从FIFO到数据传输实战 在嵌入式Linux开发中&#xff0c;I2C总线作为连接各类传感器的关键通道&#xff0c;其驱动性能直接影响系统响应速度和稳定性。DW_I2C&#xff08;DesignWare I2C&#xff09;作为业界广泛采用的IP核&…...

告别爆显存!在16G显卡上高效训练SDXL LORA的完整配置流程

16G显卡极限优化&#xff1a;SDXL LORA训练全流程实战指南 引言 当你手握一块RTX 4060 Ti或4070这样的16G显存显卡&#xff0c;想要尝试SDXL LORA训练时&#xff0c;是否常被爆显存的恐惧支配&#xff1f;别担心&#xff0c;这不是硬件性能的终点&#xff0c;而是优化艺术的起点…...

XGBoost+SHAP实战:如何让机器学习模型‘看懂’地图?

XGBoostSHAP实战&#xff1a;如何让机器学习模型‘看懂’地图&#xff1f; 当机器学习遇上地理空间数据&#xff0c;我们常常面临一个核心矛盾&#xff1a;模型预测精度与人类可解释性之间的博弈。传统GIS分析方法如空间滞后模型&#xff08;SLM&#xff09;或地理加权回归&…...

LabVIEW与TCP远程实验监测

后疫情时代线上教学的普及&#xff0c;让理工类实验课的远程开展成为行业研究重点。传统线上教学工具仅适用于理论知识传播&#xff0c;针对需要动手实操的实验课程&#xff0c;存在实践操作不便、课堂监管弱化、成果验收困难等问题。国内现有远程实验系统多以虚拟仿真为主&…...

终极指南:如何在ComfyUI中掌握IPAdapter Plus图像风格迁移技术

终极指南&#xff1a;如何在ComfyUI中掌握IPAdapter Plus图像风格迁移技术 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 在AI图像生成领域&#xff0c;ComfyUI IPAdapter Plus插件正在成为图像风格迁…...

ollama-QwQ-32B中文优化:提升OpenClaw处理本地文档的准确率

ollama-QwQ-32B中文优化&#xff1a;提升OpenClaw处理本地文档的准确率 1. 为什么需要专门优化中文文档处理 去年我在用OpenClaw处理公司合同时&#xff0c;发现一个尴尬现象&#xff1a;同样的合同解析任务&#xff0c;英文版能准确提取条款和日期&#xff0c;中文版却频繁出…...

SEO_资深从业者的高级SEO策略与实战技巧

前言&#xff1a;SEO的进阶之道 在当今互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经不再是一个简单的任务。对于资深从业者来说&#xff0c;SEO不仅仅是一门技术&#xff0c;更是一门艺术。本文将从多个角度探讨资深从业者的高级SEO策略与实战技巧&…...

Cesium 视角控制全攻略:禁用鼠标交互的多种方法

1. 为什么需要禁用Cesium鼠标交互&#xff1f; 在开发基于Cesium的三维地理信息系统时&#xff0c;我们经常会遇到需要限制用户视角操作的场景。比如在展示固定路线的飞行演示时&#xff0c;如果允许用户随意旋转地图&#xff0c;可能会打乱预设的动画效果&#xff1b;在嵌入式…...

ChatGPT归档数据恢复机制深度解析:原理与实战指南

ChatGPT归档数据恢复机制深度解析&#xff1a;原理与实战指南 在AI应用开发中&#xff0c;数据管理是一个绕不开的话题。随着项目迭代和用户量增长&#xff0c;对话记录、训练数据、配置信息等会迅速累积。为了平衡存储成本与数据可用性&#xff0c;归档&#xff08;Archive&a…...

AnimateDiff文生视频零基础入门:5分钟学会用文字生成动态GIF

AnimateDiff文生视频零基础入门&#xff1a;5分钟学会用文字生成动态GIF 1. 为什么选择AnimateDiff作为文生视频的起点&#xff1f; 如果你曾经尝试过AI视频生成工具&#xff0c;可能会被复杂的操作流程和硬件要求劝退。传统方案往往需要你先准备一张静态图片&#xff0c;再通…...