加载中...

spring cloud config (中文乱码问题)


a. 问题描述:当从远端拉取的properties配置文件中含有中文,呈现乱码

b. 产生原因:
        spring 中默认使用PropertiesPropertySourceLoader进行properties文件解析,在解析过程会利用OriginTrackedPropertiesLoader创建CharacterReader, 而问题就出现在这个CharacterReader身上,内部指定了ISO_8859_1编码,导致解析中文乱码!

c. 解决方法:
        对于spring cloud config组件由两部分组成,分别是configServerconfigClientconfigClientconfigServer发起配置请求,configServergithub上拉取配置并在本地缓存,而后对配置文件进行解析,最后将配置发送个configClient, 所以,问题主要解决点在configServer方!。

注意:下述操作在configServer方!!!

        创建两个自定义对象,分别是CustomizedOriginTrackedPropertiesLoaderCustomizedPropertiesPropertySourceLoader分别对应源码的OriginTrackedPropertiesLoaderPropertiesPropertySourceLoader,可以对着源码直接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
posted @ 2022-03-25 03:55  dada-hua  阅读(602)  评论(0)    收藏  举报