Spring Boot default properties encoding change?

13,326

Apparently properties loaded by Spring Boot's ConfigFileApplicationListener are encoded in ISO 8859-1 character encoding, which is by design and according to format specification.

On the other hand, the .yaml format supports UTF-8 out of the box. A simple extension change fixes the problem for me.

Share:
13,326
JockX
Author by

JockX

Updated on June 09, 2022

Comments

  • JockX
    JockX almost 2 years

    I am trying to find a way to set UTF-8 encoding for properties accessed via @Value annotation from application.property files in Spring boot. So far I have been successfully set encoding to my own properties sources by creating a bean:

    @Bean
    @Primary
    public PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setLocation(new ClassPathResource("app.properties");
        configurer.setFileEncoding("UTF-8");
        return configurer;
    }
    

    Such solution presents two problems. For once, it does NOT work with "application.properties" locations used by default by Spring Boot (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config), and I am forced to use different file names.

    And the other problem is, with it I am left with manually defining and ordering supported locations for multiple sources (eg. in jar vs outside jar properties file, etc) thus redoing a job well done already.

    How would I obtain a reference to already configured PropertySourcesPlaceholderConfigurer and change it's file encoding at just the right time of application initialization?

    Edit: Perhaps I am doing a mistake somewhere else? This is what causes actual problem for me: When I use application.properties to allow users to apply personal name to emails sent from an application:

    @Value("${mail.mailerAddress}")
    private String mailerAddress;
    
    @Value("${mail.mailerName}")
    private String mailerName;                       // Actual property is Święty Mikołaj
    
    private InternetAddress getSender(){
        InternetAddress sender = new InternetAddress();
        sender.setAddress(mailerAddress);
        try {
            sender.setPersonal(mailerName, "UTF-8"); // Result is Święty Mikołaj
            // OR: sender.setPersonal(mailerName);   // Result is ??wiÄ?ty Miko??aj
        } catch (UnsupportedEncodingException e) {
            logger.error("Unsupported encoding used in sender name", e);
        }
        return sender;
    }
    

    When I have placeholderConfigurer bean as shown above added, and place my property inside 'app.properties' it is resoved just fine. Just renaming the file to 'application.properties' breaks it.

  • Garret Wilson
    Garret Wilson over 3 years
    But JDK 9 supports properties files in UTF-8. Has the latest Spring Boot been updated to match?