web-dev-qa-db-fra.com

Codage UTF-8 des attributs application.properties dans Spring-Boot

Dans mon application.properties, j'ajoute des attributs personnalisés.

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

Dans cette classe, j'ai la représentation des attributs personnalisés.

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

Et ici j'utilise ma 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();
        }
    }

Pendant le débogage, je peux voir que ma variable this.getSubjectMessage() a cette valeur à l'intérieur: This is a ä ö ü à problem. Donc, avant d’envoyer mon courrier, j’ai déjà un problème d’encodage UTF-8.  

J'ai déjà vérifié le codage du fichier application.properties et de son UTF-8. 

Mon IDE (STS/Eclipse) et les propriétés du projet sont également définis sur UTF-8. 

Comment définir le codage UTF-8 pour le texte de mes attributs personnalisés dans le fichier application.properties?

15
Patrick

Comme déjà mentionné dans les commentaires, les fichiers .properties doivent être encodés dans l'ISO 8859-1. On peut utiliser des échappements Unicode pour spécifier d'autres caractères. Il existe également un outil disponible pour effectuer la conversion. Cela peut par exemple être utilisé dans la construction automatique afin que vous puissiez toujours utiliser votre encodage favori dans la source.

16
Henry

J'ai rencontré le même problème . Dans Spring Boot, il y a 2 PropertySourceLoader qui sont utilisés pour charger les propriétés dans l'application:

  • PropertiesPropertySourceLoader - prend en charge UTF-8 uniquement lors du chargement à partir de XML
  • YamlPropertySourceLoader - prend en charge UTF-8, mais vous devez modifier le format de configuration pour l'utiliser.

Ils sont répertoriés dans le fichier https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

Nous avons donc décidé d'écrire notre propre implémentation de PropertySourceLoader qui serait capable de charger correctement les propriétés à partir du fichier UTF-8. L'idée vient de answer @BalusC - Comment utiliser UTF-8 dans les propriétés de ressources avec ResourceBundle

Notre implémentation 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;
}

}

Ensuite, nous avons créé le fichier resources/META-INF/spring.factories avec le contenu:

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

Nous avons maintenant 3 PropertySourceLoader dans notre application dans l'ordre suivant:

  • UnicodePropertiesPropertySourceLoader
  • PropertiesPropertySourceLoader
  • YamlPropertySourceLoader

REMARQUES!

  1. Je ne suis pas sûr que l'utilisation de PropertyResourceBundle soit appropriée
  2. Je ne suis pas sûr que l'ordre des PropertySourceLoaders dans Spring Boot soit le même si vous créez une bibliothèque dédiée pour la réutiliser dans d'autres projets.

Dans notre projet, cette solution fonctionne bien.

METTRE À JOUR!

Il est préférable d'implémenter la méthode de chargement de UnicodePropertiesPropertySourceLoader sans PropertyResourceBundle:

@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

Essayez d’ajouter une annotation PropertySource avec un paramètre de codage dans votre fichier de configuration: 

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

J'espère que ça aide. 

8
May12

Pour définir le codage UTF-8 pour le texte du fichier application.properties (ainsi que pour toute autre propriété Java ou variable d’environnement), ajoutez -Dfile.encoding=UTF-8 à la commande agrs en ligne Java.

1
Aleksey