SpringBoot读取properties中文乱码解决方案

 更新时间:2024年12月24日 09:40:12   作者:大饼酥  
本文主要介绍了在Spring Boot中读取带有中文字符串的application.properties文件时遇到乱码问题的解决方案,具有一定的参考价值,感兴趣的可以了解一下

一、问题描述

由于业务需求需要在application.properties中配置一个带有中文字符串的参数,注入到业务类中,但是发现注入的中文是乱码的。大概情况如下所示:

package com.cnstar.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * cnstar单元测试
 * @author cnstar
 **/
@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class CnstarTest {

    @Value("${name}")
    private String name;

    @Test
    public void test1() {
        System.out.println("中文内容:" + name);
    }
}

打印输出结果:

二、解决方案

2.1、网络上的解决办法

遇到问题首先想到网络上找解决方案,网络上的解决办法基本一致,概括为以下三种。 

2.1.1、修改IDEA编码 

在IDEA中将所有的编码设置为UTF-8,同时勾上Transparent native-to-ascii conversion的选项,然后重新创建application.properties的文件。

运行结果:

但是这个配置文件用记事本打开编辑时,发现内容被修改成了unicode编码,在线上修改时变得很困难,所以此方式我不做推荐。 

2.1.2、改为yml配置

就是将application.properties的文件修改为application.yml的结构,重启项目。

运行效果

证明是可行的。这种方式可以根据自己需求选择,但是当配置文件的内容层级较深时也不推荐,容易看错行配置。

2.1.3、读取时设置编码

package com.cnstar.test.property;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.annotation.PostConstruct;

@Configuration
@PropertySource(value = "classpath:application.properties", encoding = "utf-8")
public class CnstarProperty {
    @Value("${name}")
    private String name;

    @PostConstruct
    public void init() {
        System.out.println("name is :" + name);
    }
}

 亲测发现这种方式针对application.properties是不行的。

但是针对其他名称的properties文件是可以的

package com.cnstar.test.property;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.annotation.PostConstruct;

@Configuration
@PropertySource(value = "classpath:test.properties", encoding = "utf-8")
public class CnstarProperty {
    @Value("${name2}")
    private String name;

    @PostConstruct
    public void init() {
        System.out.println("name is :" + name);
    }
}

运行结果:

2.2、重写资源加载类(个人推荐)

 1、创建一个类继承PropertiesPropertySourceLoader,因SpringBoot版本不同PropertiesPropertySourceLoader类会有差别,本文采用的SpringBoot版本是2.3.12.RELEASE。

package com.cnstar.utils;

import org.springframework.core.io.*;
import org.springframework.core.env.*;
import org.springframework.boot.env.*;
import java.util.*;
import java.io.*;

/**
 * 解快springBoot读取properties配置文件中文乱码的问题
 * @author cnstar
 **/
public class SelfPropertySourceLoader extends PropertiesPropertySourceLoader {

    @Override
    public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
        Map<String, ?> properties = this.loadUseUtf8(resource);
        if (properties.isEmpty()) {
            return Collections.emptyList();
        }
        return Collections.singletonList(new OriginTrackedMapPropertySource(name, Collections.unmodifiableMap((Map<?, ?>)properties), true));
    }

    private Map<String, ?> loadUseUtf8(Resource resource) throws IOException {
        Properties props = new Properties();
        InputStream is = resource.getInputStream();
        try {
            String filename = resource.getFilename();
            if (filename != null && filename.endsWith(".xml")) {
                props.loadFromXML(is);
            }
            else {
                props.load(new InputStreamReader(is, "utf-8"));
            }
        } finally {
            is.close();
        }
        return (Map)props;
    }
}

2.在resource目录下创建目录META-INF,在META-INF目录下创建文件spring.factories

内容如下:

org.springframework.boot.env.PropertySourceLoader=com.cnstar.utils.SelfPropertySourceLoader

 重新运行:

到此这篇关于SpringBoot读取properties中文乱码解决方案的文章就介绍到这了,更多相关SpringBoot读取properties中文乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java去除已排序数组中的重复元素

    java去除已排序数组中的重复元素

    这篇文章主要为大家详细介绍了java去除已排序数组中重复元素的方法,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • SparkSQL快速入门教程

    SparkSQL快速入门教程

    Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块,今天通过本文给大家介绍SparkSQL快速入门教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • 深入同步访问共享的可变数据分析

    深入同步访问共享的可变数据分析

    本篇文章是对同步访问共享的可变数据进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 详解Spring中Bean的作用域与生命周期

    详解Spring中Bean的作用域与生命周期

    Spring作为当前Java最流行、最强大的轻量级框架,受到了程序员的热烈欢迎。准确的了解Spring Bean的作用域与生命周期是非常必要的。这篇文章将问你详解一下Bean的作用域与生命周期,需要的可以参考一下
    2021-12-12
  • 关于IDEA无法预览Markdown文件的解决思路

    关于IDEA无法预览Markdown文件的解决思路

    在IntelliJ IDEA中,有时Markdown文件无法预览可能是因为文件关联设置不正确或配置信息错误,首先,检查IDE的File Types设置,确保.md和.markdown后缀已正确注册,其次,对照官方配置信息,调整Markdown设置
    2024-09-09
  • java实现大文件导出的实现与优化

    java实现大文件导出的实现与优化

    这篇文章主要为大家详细介绍了java实现大文件导出的实现与优化的相关资料,文中的示例代码讲解详细,对我们深入了解java有一定的帮助,感兴趣的小伙伴可以了解下
    2023-11-11
  • java制作仿微信视频播放控件

    java制作仿微信视频播放控件

    这篇文章主要介绍了java制作仿微信视频播放控件的方法和代码分享,控件继承自SurfaceView,十分的实用,小伙伴们可以自由扩展。
    2015-04-04
  • Java基础之final关键字作用案例

    Java基础之final关键字作用案例

    这篇文章主要介绍了Java基础之final关键字作用案例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • FeignMultipartSupportConfig上传图片配置方式

    FeignMultipartSupportConfig上传图片配置方式

    这篇文章主要介绍了FeignMultipartSupportConfig上传图片配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java实现的两种常见简单查找算法示例【快速查找与二分查找】

    Java实现的两种常见简单查找算法示例【快速查找与二分查找】

    这篇文章主要介绍了Java实现的两种常见简单查找算法,结合具体实例形式分析了java快速查找与二分查找的原理与简单实现技巧,需要的朋友可以参考下
    2017-09-09

最新评论