web-dev-qa-db-ja.com

Spring-Bootのapplication.properties属性のUTF-8エンコーディング

_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に設定されます。

_application.properties_ファイルのカスタム属性のテキストにUTF-8エンコーディングを設定するにはどうすればよいですか?

15
Patrick

コメントですでに述べたように、.propertiesファイルはISO 8859-1でエンコードされることが期待されています。 Unicodeエスケープを使用して他の文字を指定できます。また、変換を行うために利用可能な tool もあります。これは、たとえば、自動ビルドで使用できるため、ソースでお気に入りのエンコードを使用できます。

16
Henry

私は同じ問題に直面しました。 Spring Bootには、アプリケーションにプロパティをロードするために使用される2つのPropertySourceLoaderがあります。

  • PropertiesPropertySourceLoader-XMLからのロード時のみUTF-8をサポート
  • YamlPropertySourceLoader-UTF-8をサポートしますが、使用するには構成形式を変更する必要があります

ファイルにリストされている https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories =

そこで、UTF-8ファイルからプロパティを正しくロードできるPropertySourceLoaderの独自の実装を作成することにしました。アイデアは答え@BalusCからです- ResourceBundleでリソースプロパティでUTF-8を使用する方法

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. 専用ライブラリを作成して他のプロジェクトで再利用する場合、Spring BootでのPropertySourceLoaderの順序が同じになるかどうかはわかりません。

私たちのプロジェクトでは、このソリューションは問題なく機能します。

更新!

PropertyResourceBundleなしでUnicodePropertiesPropertySourceLoaderのloadメソッドを実装することをお勧めします。

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

エンコーディングパラメータを使用したPropertySourceアノテーションを設定ファイルに追加してみてください:

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

それが役に立てば幸い。

8
May12

Application.properties(およびその他のJavaプロパティと環境変数)のテキストにUTF-8エンコーディングを設定するには、-Dfile.encoding=UTF-8 to Javaコマンドラインagrs。

1
Aleksey