Кодирование 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
ПРИМЕЧАНИЯ!
- Я не уверен, что это правильное использование PropertyResourceBundle
- Я не уверен, что порядок 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/