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

后端 未结 5 1809
没有蜡笔的小新
没有蜡笔的小新 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:11

    just converted the text with the special chars with https://native2ascii.net/

    0 讨论(0)
  • 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<String> 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;
    }
    
    0 讨论(0)
  • 2020-12-15 05:22

    To set the UTF-8 encoding for the text in the application.properties (and any other Java properties as well as environment variables) add -Dfile.encoding=UTF-8 to java command line agrs.

    0 讨论(0)
  • 2020-12-15 05:35

    As already mentioned in the comments .properties files are expected to be encoded in ISO 8859-1. One can use unicode escapes to specify other characters. There is also a tool available to do the conversion. This can for instance be used in the automatic build so that you still can use your favorite encoding in the source.

    0 讨论(0)
  • 2020-12-15 05:35

    Please, try to add PropertySource annotation with encoding parameter into your Configuaration file:

    @PropertySource(value = "classpath:application-${env}.properties", encoding = "UTF-8")
    

    Hope it helps.

    0 讨论(0)
提交回复
热议问题