Spring 引导默认属性编码更改?
Spring Boot default properties encoding change?
我正在尝试找到一种方法来为通过 Spring 文件中 Spring 文件的 @Value
注释访问的属性设置 UTF-8 编码。到目前为止,我已经通过创建一个 bean 成功地将编码设置为我自己的属性源:
@Bean
@Primary
public PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(new ClassPathResource("app.properties");
configurer.setFileEncoding("UTF-8");
return configurer;
}
这样的解决方案存在两个问题。这一次,它不适用于 Spring Boot (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config) 默认使用的 "application.properties" 位置,我不得不使用不同的文件名。
另一个问题是,我需要为多个源手动定义和排序支持的位置(例如,在 jar 与外部 jar 属性文件等),因此重做已经做得很好的工作。
我如何获取对已配置的 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
bean,并将我的 属性 放在 'app.properties' 中时,它就很好地解决了。只需将文件重命名为 'application.properties' 即可破坏它。
Apparently 由 Spring Boot 的 ConfigFileApplicationListener
加载的属性以 ISO 8859-1 字符编码编码,这是设计使然并符合格式规范。
另一方面,.yaml format 开箱即用地支持 UTF-8。一个简单的扩展更改就解决了我的问题。
@JockX 建议非常有效。此外,从 属性 到 yaml 的转换非常简单。
这个:
spring.main.web_environment=false
email.subject.text=Here goes your subject
email.from.name=From Me
email.from.address=me@here.com
email.replyTo.name=To Him
email.replyTo.address=to@him.com
会变成:
spring:
main:
web_environment: false
email:
subject:
text: Here goes your subject
from:
name: From Me
address: me@here.com
replyTo:
name: To Him
address: to@him.com
另一种方法是将整个文件从 .properties
重命名为 .yml
,您可以选择需要 UTF-8
支持的道具并将它们移动到 .yml
文件.这样你就不需要重写你的 .properties
文件。
我建议这样做,因为如果你有像
这样的道具
my.string.format= %s-hello-%s
这会破坏 .yml 文件。您必须将它们写成
my.string.format: |
%s-hello-%s
然后导致在读取 Java 代码时在 属性 值 my.string.format
中添加新行。
我正在尝试找到一种方法来为通过 Spring 文件中 Spring 文件的 @Value
注释访问的属性设置 UTF-8 编码。到目前为止,我已经通过创建一个 bean 成功地将编码设置为我自己的属性源:
@Bean
@Primary
public PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(new ClassPathResource("app.properties");
configurer.setFileEncoding("UTF-8");
return configurer;
}
这样的解决方案存在两个问题。这一次,它不适用于 Spring Boot (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config) 默认使用的 "application.properties" 位置,我不得不使用不同的文件名。
另一个问题是,我需要为多个源手动定义和排序支持的位置(例如,在 jar 与外部 jar 属性文件等),因此重做已经做得很好的工作。
我如何获取对已配置的 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
bean,并将我的 属性 放在 'app.properties' 中时,它就很好地解决了。只需将文件重命名为 'application.properties' 即可破坏它。
Apparently 由 Spring Boot 的 ConfigFileApplicationListener
加载的属性以 ISO 8859-1 字符编码编码,这是设计使然并符合格式规范。
另一方面,.yaml format 开箱即用地支持 UTF-8。一个简单的扩展更改就解决了我的问题。
@JockX 建议非常有效。此外,从 属性 到 yaml 的转换非常简单。 这个:
spring.main.web_environment=false
email.subject.text=Here goes your subject
email.from.name=From Me
email.from.address=me@here.com
email.replyTo.name=To Him
email.replyTo.address=to@him.com
会变成:
spring:
main:
web_environment: false
email:
subject:
text: Here goes your subject
from:
name: From Me
address: me@here.com
replyTo:
name: To Him
address: to@him.com
另一种方法是将整个文件从 .properties
重命名为 .yml
,您可以选择需要 UTF-8
支持的道具并将它们移动到 .yml
文件.这样你就不需要重写你的 .properties
文件。
我建议这样做,因为如果你有像
这样的道具my.string.format= %s-hello-%s
这会破坏 .yml 文件。您必须将它们写成
my.string.format: |
%s-hello-%s
然后导致在读取 Java 代码时在 属性 值 my.string.format
中添加新行。