webentwicklung-frage-antwort-db.com.de

UTF-8-Codierung von application.properties-Attributen im Spring-Boot

In meinem application.properties füge ich einige benutzerdefinierte Attribute hinzu.

custom.mail.property.subject-message=This is a ä ö ü ß problem

In dieser Klasse habe ich die Darstellung der benutzerdefinierten Attribute.

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

Und hier verwende ich meine 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();
        }
    }

Während des Debugging kann ich sehen, dass meine this.getSubjectMessage()-Variable diesen Wert enthält: This is a ä ö ü à problem. Vor dem Versenden meiner Mail habe ich also bereits ein UTF-8-Codierungsproblem.  

Ich habe bereits die Kodierung der application.properties-Datei und deren UTF-8 überprüft. 

Meine IDE (STS/Eclipse) und die Projekteigenschaften werden ebenfalls in UTF-8 festgelegt. 

Wie kann ich die UTF-8-Kodierung für den Text meiner benutzerdefinierten Attribute in der application.properties-Datei festlegen?

15
Patrick

Wie bereits erwähnt, wird erwartet, dass .properties-Dateien in ISO 8859-1 kodiert werden. Sie können Unicode-Escape-Zeichen verwenden, um andere Zeichen anzugeben. Es gibt auch ein tool für die Konvertierung. Dies kann beispielsweise beim automatischen Build verwendet werden, sodass Sie Ihre bevorzugte Codierung in der Quelle weiterhin verwenden können.

16
Henry

Ich bin mit dem gleichen Problem konfrontiert ... In Spring Boot gibt es zwei PropertySourceLoader, die zum Laden von Eigenschaften in der Anwendung verwendet werden:

  • PropertiesPropertySourceLoader - unterstützt UTF-8 nur beim Laden aus XML
  • YamlPropertySourceLoader - unterstützt UTF-8, Sie müssen jedoch das Konfigurationsformat ändern, um es verwenden zu können

Sie sind in der Datei https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories aufgelistet.

Daher haben wir uns entschlossen, unsere eigene Implementierung von PropertySourceLoader zu schreiben, mit der die Eigenschaften der UTF-8-Datei korrekt geladen werden können. Die Idee stammt von answer @BalusC - Verwendung von UTF-8 in Ressourceneigenschaften mit ResourceBundle

Unsere PropertySourceLoader-Implementierung:

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

}

Dann haben wir die Datei resources/META-INF/spring.factories mit dem Inhalt erstellt:

# Custom PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
your.own.package.UnicodePropertiesPropertySourceLoader

Jetzt haben wir 3 PropertySourceLoader in unserer Anwendung in der folgenden Reihenfolge:

  • UnicodePropertiesPropertySourceLoader
  • PropertiesPropertySourceLoader
  • YamlPropertySourceLoader

ANMERKUNGEN!

  1. Ich bin nicht sicher, ob PropertyResourceBundle ordnungsgemäß verwendet wird
  2. Ich bin nicht sicher, ob die Reihenfolge der PropertySourceLoaders in Spring Boot dieselbe ist, wenn Sie eine dedizierte Bibliothek erstellen, um sie in anderen Projekten wiederzuverwenden.

In unserem Projekt funktioniert diese Lösung gut.

AKTUALISIEREN!

Es ist besser, die Lademethode von UnicodePropertiesPropertySourceLoader ohne PropertyResourceBundle zu implementieren:

@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

Versuchen Sie, der Konfigurationsdatei eine PropertySource-Annotation mit dem Kodierungsparameter hinzuzufügen: 

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

Ich hoffe es hilft. 

8
May12

Um die UTF-8-Kodierung für den Text in application.properties (und anderen Java-Eigenschaften sowie Umgebungsvariablen) festzulegen, fügen Sie -Dfile.encoding=UTF-8 zu Java-Befehlszeilen-agrs hinzu.

1
Aleksey