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
?
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.
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:
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:
REMARQUES!
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;
}
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.
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.