Spring 最佳实践~1PropertyPlaceholderConfigurer 乱码解决方案

Posted 戴泽supp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 最佳实践~1PropertyPlaceholderConfigurer 乱码解决方案相关的知识,希望对你有一定的参考价值。

PropertyPlaceholderConfigurer 乱码解决方案

一、问题描述

使用 PropertyPlaceholderConfigurer 读取配置文件时,发现对于中文的处理会出现乱码现象。

二、示例

app-context-processor.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="testBean" class="com.luo.spring.guides.post.processor.PostProcessorTestBean">
        <property name="name">
            <value>$bean.name</value>
        </property>
    </bean>

    <bean id="testBeanHandler" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>postprocessor/bean.properties</value>
            </list>
        </property>
    </bean>
</beans>

bean.properties

bean.name=我是小小罗

PostProcessorTestBean.java

package com.luo.spring.guides.post.processor;

import lombok.Data;

/**
 * @author : archer
 * @date : Created in 2023/1/3 11:36
 * @description :
 */
@Data
public class PostProcessorTestBean 
    private String name;

测试

package com.luo.spring.guides.post.processor;

import org.springframework.context.support.GenericXmlApplicationContext;

import java.util.Locale;

/**
 * @author : archer
 * @date : Created in 2023/1/3 11:38
 * @description :
 */
public class Main 
    public static void main(String... args) 
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.load("classpath:postprocessor/app-context-processor.xml");
        ctx.refresh();

        PostProcessorTestBean testBean = ctx.getBean("testBean", PostProcessorTestBean.class);
        System.out.println(testBean.getName());
        ctx.close();
    

输出

我是小小罗

三、解决思路

1、寻找编码属性

  • 通过查看 PropertyPlaceholderConfigurer 的继承关系,发现其父类 PropertiesLoaderSupport 中存在 fileEncoding 属性

2、查看加载配置的方法

/**
	 * Load properties into the given instance.
	 * @param props the Properties instance to load into
	 * @throws IOException in case of I/O errors
	 * @see #setLocations
	 */
protected void loadProperties(Properties props) throws IOException 
		if (this.locations != null) 
			for (Resource location : this.locations) 
				if (logger.isTraceEnabled()) 
					logger.trace("Loading properties file from " + location);
				
				try 
					PropertiesLoaderUtils.fillProperties(
							props, new EncodedResource(location, this.fileEncoding), this.propertiesPersister);
				
				catch (FileNotFoundException | UnknownHostException | SocketException ex) 
					if (this.ignoreResourceNotFound) 
						if (logger.isDebugEnabled()) 
							logger.debug("Properties resource not found: " + ex.getMessage());
						
					
					else 
						throw ex;
					
				
			
		
	

3、使用编码属性

  • 在配置中加上编码属性 fileEncoding,指定为 utf-8

四、解决方案示例

PropertyPlaceholderConfigurer 加上 fileEncoding 属性配置

<property name="fileEncoding">
    <value>utf-8</value>
</property>

app-context-processor.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="testBean" class="com.luo.spring.guides.post.processor.PostProcessorTestBean">
        <property name="name">
            <value>$bean.name</value>
        </property>
    </bean>

    <bean id="testBeanHandler" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>postprocessor/bean.properties</value>
            </list>
        </property>
        <property name="fileEncoding">
            <value>utf-8</value>
        </property>
    </bean>
</beans>

输出

我是小小罗

五、小结

  • 解决思路才是精髓。

以上是关于Spring 最佳实践~1PropertyPlaceholderConfigurer 乱码解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务使用最佳实践

Spring事务使用最佳实践

Spring @Repository 最佳实践

Spring数据国际化最佳实践

打包结构化 Spring 项目的最佳实践是啥?

ehcache 或 Spring MVC 的 Spring 缓存中的最佳缓存实践是啥?