Properties配置加载(@PropertySource),额外不定的配置项单独存储到Map的一次歧路记录和正确解决思路

本文主要是介绍Properties配置加载(@PropertySource),额外不定的配置项单独存储到Map的一次歧路记录和正确解决思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 背景

笔者的一个微服务的配置是ini文件中存储的。通过下面的方式加载。

@Data
@EqualsAndHashCode(callSuper = true)
@Component
@PropertySource(value={"file:${app.config.common.path}" , "file:${app.config.path}"} , ignoreResourceNotFound=false, encoding="utf-8" , name="app-config" , factory = PropertiesExSourceFactory.class)
public class AppConfig extends AppConfCommon
{	@Value("${authcenter.appkey}")String authCenterAppKey ;@Value("${authcenter.appsecret}")String authCenterAppSecret ;@Value("${sailPyAi.url}")String sailPyAiUrl ;}

现在有一些必定数量的参数,它们都以固定的前缀开始,例如

ai.models.glm-4=xxxx
ai.models.bigwatt=xxx

想把ai.models.*的配置都收集到一起

2. 错误的尝试

此尝试,虽然失败,但里面有一些信息觉得有必要记录一下。
过程:

  1. 定义一个Map
public class AppConfig extends AppConfCommon
{	@Value("${authcenter.appkey}")String authCenterAppKey ;@Value("${authcenter.appsecret}")String authCenterAppSecret ;@Value("${sailPyAi.url}")String sailPyAiUrl ;@Value("${ai.models.*:}")Map<String, Object> aiModels ;
}
  1. 修改PropertiesExSourceFactory,在渠道.*结尾的数据时构造成一个Map返回。
	static class  PropertiesExSource  extends EnumerablePropertySource<PropertiesEx>{public PropertiesExSource(String name, PropertiesEx source) {super(name , source) ;}@Overridepublic Object getProperty(String aName){String propValue = getSource().getProperty(aName) ;if(propValue == null && aName.endsWith(".*")){// 检查键String name = aName.substring(0, aName.length()-1) ;Map<String , Object> map = CS.hashMap() ;PropertiesEx source= getSource() ;for(String propName : source.stringPropertyNames()){if(propName.startsWith(name))map.put(propName , source.getProperty(propName)) ;}if(!map.isEmpty())// 因为Spring框架对@PropertySource源,认为取得的值类型一定是String,返回map会报Map转String错误。// 所以此处把Map转成String格式return new JSONObject(map).toJSONString() ;}return propValue ;}@Overridepublic String[] getPropertyNames(){return getSource().stringPropertyNames().toArray(XArray.sEmptyStringArray) ;}}
  1. 因为目标类型是Map,所以需要一个将JSON字符串转成Map的Converter
public class JsonStrToMapConverter implements Converter<String, Map<String, Object>>
{public JsonStrToMapConverter(){}@Overridepublic Map<String, Object> convert(String source){return XString.isEmpty(source)?CS.hashMap():new JSONObject(source).toMap() ;}
}

4.注册这个Converter
因为配置文件加载较早,所以用下面的方式添加Converter

public class DefaultAppRunLsn implements ApplicationListener<ApplicationEvent>
{	// 省略@Overridepublic void onApplicationEvent(ApplicationEvent event){if(event instanceof ApplicationPreparedEvent){ConfigurableApplicationContext ctx = ((ApplicationPreparedEvent)event).getApplicationContext() ;ConversionService cs = ctx.getBeanFactory().getConversionService() ;if(cs instanceof ConverterRegistry){ConverterRegistry reg = (ConverterRegistry)cs ;reg.addConverter(new JsonStrToMapConverter());}// 省略}else if(event instanceof ServletWebServerInitializedEvent){// 省略}}
}

这么做,如果只有一个PropertySource,没有问题,但是有多个的时候,会有问题,原因就是用@Value方式注入,多个PropetySource在一个池子里了,第2步中的getSource()不一定是当前@value字段所在的那个PropertySource了。

3. 正确做法

单独在定义一个配置类。如下:

@Component
@PropertySource(value="file:${app.config.path}" , ignoreResourceNotFound=false, encoding="utf-8" , name="ai-models" , factory = PropertiesExSourceFactory.class)
@ConfigurationProperties(prefix = "ai")
public class AiModelsConf
{Properties models ;public Properties getModels(){return mConf;}public void seModels(Properties aConf){mConf = aConf;}
}

这篇关于Properties配置加载(@PropertySource),额外不定的配置项单独存储到Map的一次歧路记录和正确解决思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974438

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在