2015-01-10 2 views
3

Я пытаюсь найти способ кодирования UTF-8 для свойств, доступных через @Value аннотация из файлов application.property в Spring boot. До сих пор я успешно установил кодирование в свои собственные источники свойств, создав компонент:Изменение настроек свойств Spring Boot по умолчанию?

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

Такое решение представляет две проблемы. На этот раз он НЕ работает с местоположениями «application.properties», которые по умолчанию использовались Spring Boot (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config), и я вынужден использовать разные имена файлов.

И еще одна проблема заключается в том, что я оставил ее вручную, определяя и упорядочивая поддерживаемые местоположения для нескольких источников (например, в файле jar vs outside jar properties и т. Д.), Тем самым переделывая уже выполненную работу.

Как получить ссылку на уже настроенные объекты PropertySourcesPlaceholderConfigurer и изменить его кодировку файла в нужный момент при инициализации приложения?

Редактировать: Возможно, я ошибаюсь в другом месте? Это то, что вызывает актуальная проблема для меня: Когда я использую application.properties, чтобы позволить пользователям применять личное имя письма, отправленные из приложения:

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

Когда я placeholderConfigurer боб, как показано выше, добавил, и разместить свою собственность Внутри «app.properties» он очень хорошо переносится. Просто переименование файла в «application.properties» прерывает его.

+1

Перед тем как сделать это, вы уверены, что нет простых решений? Я использую переменные среды, и я использовал application.properties, используя UTF-8 без какой-либо конкретной проблемы. В чем именно проблема, которую вы испытываете? –

+0

@AlessandroSantini Я обновил вопрос с конкретной проблемой, которую он вызывает для меня. – JockX

+0

Если вы отлаживаете класс, вы видите ошибку? Это больше похоже на проблему вывода. – chrylis

ответ

6

Apparently свойства, загруженные Spring Boot ConfigFileApplicationListener, кодируются в кодировке символов ISO 8859-1, которая по дизайну и соответствует спецификации формата.

С другой стороны, .yaml format поддерживает UTF-8 из коробки. Простое изменение смены исправляет проблему для меня.

0

@JockX предложение работает отлично. Кроме того, преобразование из свойства в yaml довольно просто. Это:

spring.main.web_environment=false 
email.subject.text=Here goes your subject 
email.from.name=From Me 
[email protected] 
email.replyTo.name=To Him 
[email protected] 

бы стать:

spring: 
    main: 
    web_environment: false 
email: 
    subject: 
    text: Here goes your subject 
    from: 
    name: From Me 
    address: [email protected] 
    replyTo: 
    name: To Him 
    address: [email protected] 
Смежные вопросы