UTF-8 encoding of application.properties attributes in Spring-Boot

后端 未结 5 1811
没有蜡笔的小新
没有蜡笔的小新 2020-12-15 05:05

In my application.properties I add some custom attributes.

custom.mail.property.subject-message=This is a ä ö ü ß problem

In t

5条回答
  •  既然无缘
    2020-12-15 05:22

    I've faced with the same problem. In Spring Boot there are 2 PropertySourceLoader which are used to load properties in application:

    • PropertiesPropertySourceLoader - supports UTF-8 only when load from XML
    • YamlPropertySourceLoader - supports UTF-8, but you have to change configuration format to use it

    They're listed in the file https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

    So we decided to write our own implementation of PropertySourceLoader which would be able to load properties from UTF-8 file correctly. The idea is from answer @BalusC - How to use UTF-8 in resource properties with ResourceBundle

    Our PropertySourceLoader implementation:

    public class UnicodePropertiesPropertySourceLoader implements PropertySourceLoader {
    
    @Override
    public String[] getFileExtensions() {
        return new String[]{"properties"};
    }
    
    @Override
    public PropertySource load(String name, Resource resource, String profile) throws IOException {
        if (profile == null) {
            Properties properties = new Properties();
            PropertyResourceBundle bundle = new PropertyResourceBundle(new InputStreamReader(resource.getInputStream(), "UTF-8"));
            Enumeration keys = bundle.getKeys();
            while (keys.hasMoreElements()) {
                String key = keys.nextElement();
                properties.setProperty(key, bundle.getString(key));
            }
            if (!properties.isEmpty()) {
                return new PropertiesPropertySource(name, properties);
            }
        }
        return null;
    }
    
    }
    

    Then we created file resources/META-INF/spring.factories with content:

    # Custom PropertySource Loaders
    org.springframework.boot.env.PropertySourceLoader=\
    your.own.package.UnicodePropertiesPropertySourceLoader
    

    Now we have 3 PropertySourceLoader in our application in following order:

    • UnicodePropertiesPropertySourceLoader
    • PropertiesPropertySourceLoader
    • YamlPropertySourceLoader

    NOTES!

    1. I'm not sure that it is proper usage of PropertyResourceBundle
    2. I'm not sure that order of PropertySourceLoaders in Spring Boot will be the same if you make a dedicated library to reuse it in other projects.

    In our project this solution works fine.

    UPDATE!

    It's better to implement load method of UnicodePropertiesPropertySourceLoader without PropertyResourceBundle:

    @Override
    public PropertySource load(String name, Resource resource, String profile) throws IOException {
        if (profile == null) {
            Properties properties = new Properties();
            properties.load(new InputStreamReader(resource.getInputStream(), "UTF-8"));
            if (!properties.isEmpty()) {
                return new PropertiesPropertySource(name, properties);
            }
        }
        return null;
    }
    

提交回复
热议问题