spring cloud config (中文乱码问题)
a. 问题描述:当从远端拉取的properties配置文件中含有中文,呈现乱码
b. 产生原因:
spring 中默认使用PropertiesPropertySourceLoader进行properties文件解析,在解析过程会利用OriginTrackedPropertiesLoader创建CharacterReader, 而问题就出现在这个CharacterReader身上,内部指定了ISO_8859_1编码,导致解析中文乱码!
c. 解决方法:
对于spring cloud config组件由两部分组成,分别是configServer和configClient,configClient向configServer发起配置请求,configServer从github上拉取配置并在本地缓存,而后对配置文件进行解析,最后将配置发送个configClient, 所以,问题主要解决点在configServer方!。
注意:下述操作在
configServer方!!!
创建两个自定义对象,分别是CustomizedOriginTrackedPropertiesLoader和CustomizedPropertiesPropertySourceLoader分别对应源码的OriginTrackedPropertiesLoader和PropertiesPropertySourceLoader,可以对着源码直接ctrl+cv,而后改一下名字,即可,两者放在同一包,OriginTrackedPropertiesLoader访问权限默认是包私有,自定义的可以改!
注意:为了让自定义的
CustomizedPropertiesPropertySourceLoader优先级高于系统自带的PropertiesPropertySourceLoader,需要添加@Order注解,系统默认优先级最低(2147483647),我们直接Ordered.LOWEST_PRECEDENCE - 1
@Order(Ordered.LOWEST_PRECEDENCE - 1)
public class CustomizedPropertiesPropertySourceLoader implements PropertySourceLoader {
... // 对着源码直接 ctrl+cv
// 什么都不用改😁
}
public class CustomizedOriginTrackedPropertiesLoader {
... // 对着源码直接 ctrl+cv
// 什么都不用改😁
// 一路直接到私有静态内部类 CharacterReader 的构造器 (需要将字符集改成 UTF-8)
CharacterReader(Resource resource) throws IOException {
this.reader = new LineNumberReader(
new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
}
...
}
在resource类路径下创建META-INF/spring.factories文件,填写如下内容
org.springframework.boot.env.PropertySourceLoader=\
com.example.config.CustomizedPropertiesPropertySourceLoader

浙公网安备 33010602011771号