Spring Cloud 配置中心乱码解决

本文详细介绍了在SpringBoot 2.x版本中,配置中心出现中文乱码的问题及其根本原因。深入探讨了spring默认使用ISO-8859-1编码加载配置导致的乱码现象,并提供了一种自定义PropertySourceLoader的解决方案,通过重新加载配置文件并指定UTF-8编码,彻底解决了乱码问题。

1. springboot 2.X 版本 cloud的配置中心中文乱码解决

乱码原因:
spring 默认使用org.springframework.boot.env.PropertiesPropertySourceLoader 来加载配置,底层是通过调用 Properties 的 load 方法,而load方法输入流的编码是 ISO-8859-1

网上的解决办法,在配置中心自定义类实现PropertySourceLoader:

 public class MyPropertiesHandler implements PropertySourceLoader {

	private static final Logger logger = LoggerFactory.getLogger(MyPropertiesHandler.class);

	@Override
	public String[] getFileExtensions() {
		return new String[]{"properties", "xml"};
	}

	@Override
	public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
		/*List<PropertySource<?>> propertySourceList = new ArrayList<PropertySource<?>>();
        Properties properties = getProperties(resource);
        if (!properties.isEmpty()) {
            PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource(name, properties);
            propertySourceList.add(propertiesPropertySource);
        }
		return propertySourceList;*/
		Map<String, ?> properties = loadProperties(resource);
		if (properties.isEmpty()) {
			return Collections.emptyList();
		}
		return Collections
				.singletonList(new OriginTrackedMapPropertySource(name, properties));
	}

	private Map<String, ?> loadProperties(Resource resource) {
		Properties properties = new Properties();
		InputStream inputStream = null;
		try {
			inputStream = resource.getInputStream();
			properties.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
			inputStream.close();
		} catch (IOException e) {
			logger.error("load inputstream failure...", e);
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					logger.error("close IO failure ....", e);
				}
			}
		}
		return (Map) properties;
	}
}

2.在 resources下创建 META-INF 目录 并在目录下创建spring.factories文件

文件内容:org.springframework.boot.env.PropertySourceLoader=com.spring.config.MyPropertiesHandler(你的自定类路径)

但本人按此照此方法配置依旧乱码。

最终解决办法:

String str = new String(str.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
<think>好的,用户现在的问题是关于SpringCloud项目中properties配置文件的中文乱码解决方案。根据用户提供的引用内容,我需要结合之前的回答和用户提供的引用信息来整理解决方案。 首先,用户提到的引用[2]和引用[4]都涉及到中文乱码的问题。引用[2]中提到,读取application.properties中的中文参数出现乱码,需要解决。而引用[4]则提到在Zuul上传文件时,中文文件名乱码的问题,通过修改请求路径解决。不过用户现在的问题集中在properties文件本身的中文乱码,所以需要重点关注引用[2]的解决方案。 根据之前的回答,我列出了几个步骤:检查文件编码、配置IDE设置、使用Unicode转义、配置Spring Boot的编码、使用YAML格式。现在需要验证这些步骤是否符合用户提供的引用内容,并补充可能的其他方法。 用户提供的引用[2]中提到解决方案是配置文件的编码问题,可能需要设置IDE的编码为UTF-8,并且确保文件保存为UTF-8格式。这对应我之前提到的步骤1和步骤2。另外,用户还提到在application.properties中直接配置spring.http.encoding.charset=UTF-8,这可能属于步骤4的内容。 引用[4]中的解决方案涉及到Zuul的特殊处理,但用户当前的问题是关于配置文件,所以可能不需要这部分内容。但需要注意是否有其他相关配置可能影响编码,比如网关的配置。 用户可能在使用Spring Cloud Config Server(引用[1]),如果在分布式配置中心中出现乱码,可能需要检查Config Server的配置,确保服务端和客户端的编码一致。这可能需要在Config Server的配置中添加相关编码设置,或者在bootstrap.properties中指定编码。 另外,用户提到的引用[3]是关于Kafka和RabbitMQ的配置,可能与当前问题无关,但需要确认是否有其他中间件配置影响编码,但目前暂不需要考虑。 总结,用户的解决方案需要涵盖: 1. 确认文件编码为UTF-8,包括IDE设置和文件实际编码。 2. 使用Unicode转义作为临时解决方案。 3. 配置Spring Boot的HTTP编码。 4. 使用YAML格式替代properties文件。 5. 在Spring Cloud Config的情况下,确保服务端和客户端的编码一致。 6. 检查Servlet配置,如Zuul的特殊处理,但可能不适用于当前问题。 需要确保步骤清晰,引用正确的引用来源,比如在Config Server的情况下引用[1],在application.properties配置时引用[2]和[4]。同时,需要提醒用户在不同环节(如开发环境、配置中心、部署环境)中的注意事项,避免遗漏。</think>### SpringCloud项目properties文件中文乱码解决方案 在SpringCloud项目中,`application.properties`文件中文乱码问题通常由**文件编码不统一**或**配置读取未指定编码**导致。以下是详细解决方案: --- #### **一、核心解决步骤** 1. **确保文件编码为UTF-8** - **IDE设置**:在IntelliJ IDEA或Eclipse中,将`application.properties`的编码设置为UTF-8: - **IntelliJ**:`File → Settings → Editor → File Encodings` → 设置`Global Encoding`、`Project Encoding`、`Default encoding for properties files`为`UTF-8`[^2]。 - **Eclipse**:`Window → Preferences → General → Workspace` → 设置`Text file encoding`为UTF-8。 - **文件验证**:右键点击`application.properties` → 查看文件属性,确认实际编码为UTF-8。 2. **配置Spring Boot编码参数** 在`application.properties`中显式指定编码: ```properties spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true ``` 这会强制Spring Boot使用UTF-8解析请求和响应[^2]。 3. **使用Unicode转义(临时方案)** 将中文字符转换为Unicode编码(如`中文` → `\u4E2D\u6587`),避免直接写入中文: ```properties file.path=\u4E2D\u6587\u6587\u4EF6\u5939 ``` 可通过在线工具(如`native2ascii`)快速转换[^2]。 4. **改用YAML格式文件** YAML文件对UTF-8支持更友好,且支持中文直接写入: ```yaml file: path: 中文文件夹 ``` 将`application.properties`重命名为`application.yml`并调整语法。 --- #### **二、进阶场景与配置** 1. **Spring Cloud Config分布式配置中心** 若使用Config Server(如引用[1]中的`spring-cloud-config-server`),需确保**服务端与客户端编码一致**: - **服务端**:在Config Server的`bootstrap.properties`中指定编码: ```properties spring.cloud.config.server.git.encoding=UTF-8 ``` - **客户端**:在微服务的`bootstrap.properties`中配置: ```properties spring.cloud.config.encoding=UTF-8 ``` 2. **Zuul网关文件上传乱码处理** 若通过Zuul上传含中文名的文件(如引用[4]场景),需在请求路径前添加`/zuul`绕过默认编码过滤器: ```bash # 原请求(可能乱码) localhost:8005/oss/file/upload # 修正后请求 localhost:8005/zuul/oss/file/upload ``` 同时在Zuul配置中强制UTF-8编码: ```properties zuul.servlet-path=/zuul zuul.force-encoding=true spring.http.encoding.charset=UTF-8 ``` --- #### **三、验证与调试** 1. **日志输出验证** 在代码中读取配置并打印,检查日志是否显示正确中文: ```java @Value("${file.path}") private String filePath; @PostConstruct public void init() { System.out.println("读取路径:" + filePath); // 控制台应为"中文文件夹" } ``` 2. **HTTP请求测试** 使用Postman发送请求,检查响应头中的`Content-Type`是否包含`charset=UTF-8`: ```http Content-Type: text/html;charset=UTF-8 ``` --- #### **四、常见问题排查** - **问题1**:IDE控制台仍显示乱码 **解决**:检查运行配置(如Tomcat/JVM参数)是否添加`-Dfile.encoding=UTF-8`。 - **问题2**:Nginx反向代理导致乱码 **解决**:在Nginx配置中添加`charset utf-8;`: ```nginx server { listen 80; charset utf-8; # 其他配置... } ``` --- ### 相关问题 1. 如何将Spring Boot项目的默认配置文件从properties切换为YAML? 2. Spring Cloud Config Server如何实现配置文件的动态刷新(结合@RefreshScope)? 3. 微服务架构下,如何统一管理多环境的配置文件(如开发、测试、生产)? 通过以上方案,可彻底解决SpringCloud项目中properties文件中文乱码问题。若涉及分布式配置中心或网关,需同步调整服务端与客户端的编码设置[^1][^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值