Java Spring引导默认属性编码更改?

Java Spring引导默认属性编码更改?,java,utf-8,spring-boot,properties-file,Java,Utf 8,Spring Boot,Properties File,我试图找到一种方法,为通过Spring boot中application.property文件的@Value注释访问的属性设置UTF-8编码。到目前为止,我已经通过创建一个bean成功地将编码设置为我自己的属性源: @Bean @Primary public PropertySourcesPlaceholderConfigurer placeholderConfigurer(){ PropertySourcesPlaceholderConfigurer configurer = new

我试图找到一种方法,为通过Spring boot中application.property文件的
@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;
}
这种解决方案存在两个问题。这一次,它不适用于springboot()默认使用的“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”即可将其破坏。

由Spring Boot的
ConfigFileApplicationListener加载的属性以ISO 8859-1字符编码编码,这是根据设计和格式规范进行的

另一方面,支持UTF-8开箱即用。一个简单的扩展更改就解决了我的问题。

建议非常有效。此外,从属性到yaml的转换非常简单。 这:

将成为:

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
文件。这样您就不需要重写ur
.properties
文件

我建议这样做,因为如果你有这样的道具

my.string.format= %s-hello-%s
这会在.yml文件中中断。你必须把它们写成

my.string.format: |
   %s-hello-%s

这将导致在读取Java代码时在属性valye
my.string.format
中添加新行。

在此之前,您确定没有更简单的解决方案吗?我使用环境变量,并且使用UTF-8使用application.properties,没有任何特殊问题。您遇到的问题到底是什么?@AlessandroSantini我已经更新了这个问题,并说明了它给我造成的特殊问题。如果您调试这个类,您看到错误了吗?听起来更像是输出问题。@chrylis-值注释字符串具有不同的值,这取决于我是将属性存储在app.properties(由我的PropertySourcesPlaceholderConfigurer访问)还是application.propertes(spring默认值)中。看起来不是输出问题。您是否尝试使用编码字符串?我没有时间去检查InternetAddress是否是隐藏的,但我引用的类对名称进行了符合RFC-2047的翻译(显然只需要美国字符,除非我误解了规范)。但是。最新的Spring引导是否已更新以匹配?
my.string.format: |
   %s-hello-%s