Кодирование UTF-8 атрибутов application.properties в Spring -Boot

В моем application.properties я добавляю некоторые пользовательские атрибуты.

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

В этом классе у меня есть представление пользовательских атрибутов.

@Component
@ConfigurationProperties(prefix="custom.mail.property")
public class MailProperties {
    private String subjectMessage;
    public String getSubjectMessage() {
        return subjectMessage;
    }
    public void setSubjectMessage(String subjectMessage) {
        this.subjectMessage = subjectMessage;
    }

И здесь я использую свой MailProperties:

@Service
public class SimpleUnknownResponseMessage extends MailProperties implements UnknownResponseMessage{

    private JavaMailSender javaMailSender;

    @Autowired
    public SimpleUnknownResponseMessage(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Override
    public void placeUnknownResponse(BookResponse bookResponse) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8");
            helper.setSubject(this.getSubjectMessage());            
            javaMailSender.send(message);

        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

Во время отладки я вижу, что моя переменная this.getSubjectMessage() имеет это значение внутри: This is a ä ö ü à problem. Поэтому перед отправкой почты у меня уже есть проблема с кодировкой UTF-8.

Я уже проверил кодировку файла application.properties и его UTF-8.

Моя IDE (STS/Eclipse) и свойства проекта также установлены на UTF-8.

Как настроить кодировку UTF-8 для текста моих пользовательских атрибутов в файле application.properties?

Ответ 1

Как уже упоминалось в комментариях, файлы .properties, как ожидается, будут закодированы в ISO 8859-1. Для указания других символов можно использовать escape-последовательности unicode. Существует также tool, доступный для преобразования. Это можно, например, использовать в автоматической сборке, чтобы вы все еще могли использовать свою любимую кодировку в источнике.

Ответ 2

Пожалуйста, попробуйте добавить аннотацию PropertySource с параметром кодирования в файл Configuaration:

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

Надеюсь, это поможет.

Ответ 3

Я столкнулся с той же проблемой. В Spring Boot есть 2 PropertySourceLoader, которые используются для загрузки свойств в приложении:

  • PropertiesPropertySourceLoader - поддерживает UTF-8 только при загрузке из XML
  • YamlPropertySourceLoader - поддерживает UTF-8, но вы должны изменить формат конфигурации, чтобы использовать его

Они перечислены в файле https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

Поэтому мы решили написать собственную реализацию PropertySourceLoader, которая могла бы корректно загружать свойства из файла UTF-8. Идея из ответа @BalusC - Как использовать UTF-8 в свойствах ресурса с ResourceBundle

Наша реализация PropertySourceLoader:

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;
}

}

Затем мы создали файл resources/META-INF/spring.factories с содержанием:

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

Теперь у нас есть 3 PropertySourceLoader в нашем приложении в следующем порядке:

  • UnicodePropertiesPropertySourceLoader
  • PropertiesPropertySourceLoader
  • YamlPropertySourceLoader

ПРИМЕЧАНИЯ!

  1. Я не уверен, что это правильное использование PropertyResourceBundle
  2. Я не уверен, что порядок PropertySourceLoaders в Spring Boot будет таким же, если вы создадите специальную библиотеку для повторного использования в других проектах.

В нашем проекте это решение отлично работает.

ОБНОВЛЕНИЕ!

Лучше реализовать метод загрузки UnicodePropertiesPropertySourceLoader без 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;
}

Ответ 4

Чтобы установить кодировку UTF-8 для текста в application.properties (и любых других свойствах Java, а также переменных среды), добавьте -Dfile.encoding=UTF-8 в агенты командной строки java.

Ответ 5

просто преобразовал текст с помощью специальных символов с https://native2ascii.net/