2016-05-25 1 views
10

Nel mio application.properties aggiungo alcuni attributi personalizzati.Codifica UTF-8 degli attributi application.properties in Spring-Boot

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

In questa classe ho la rappresentazione degli attributi personalizzati.

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

E qui uso il mio 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(); 
     } 
    } 

Durante il debug posso vedere che la mia variabile this.getSubjectMessage() ha questo valore all'interno: This is a ä ö ü à problem. Quindi, prima di inviare la mia posta ho già un problema di codifica UTF-8.

Ho già controllato la codifica del file application.properties e di UTF-8.

Anche il mio IDE (STS/Eclipse) e le proprietà del progetto sono impostati su UTF-8.

Come è possibile impostare la codifica UTF-8 per il testo dei miei attributi personalizzati nel file application.properties?

+2

Ricordo di aver letto da qualche parte che Java si aspetta che i file '* .properties' siano codificati in ISO-8859-1 ed è per questo che Spring tratta' application.properties' come se fosse in ISO-8859-1. Vedi questa domanda: [modifica della codifica delle proprietà di default di Spring Boot?] (Http://stackoverflow.com/questions/27882191/spring-boot-default-properties-encoding-change). Soluzione possibile: utilizzare YAML anziché i file delle proprietà. – Jesper

+0

@Jesper sì, ho controllato anche questa risposta. Spero ancora che ci sia forse un'altra soluzione per i file delle proprietà. – Patrick

risposta

12

Come già accennato nei commenti, i file .properties dovrebbero essere codificati in ISO 8859-1. Si possono usare gli escape unicode per specificare altri caratteri. C'è anche un tool disponibile per fare la conversione. Questo può ad esempio essere utilizzato nella compilazione automatica in modo da poter ancora utilizzare la codifica preferita nella sorgente.

+0

upvote per l'utilizzo di escape unicode per una soluzione alternativa – Patrick

6

Ho affrontato lo stesso problema. Nella primavera di avvio ci sono 2 PropertySourceLoader che vengono utilizzati per caricare immobili a applicazione:

  • PropertiesPropertySourceLoader - supporta UTF-8 solo quando il carico da XML
  • YamlPropertySourceLoader - supporta UTF-8, ma si devono cambiare formato di configurazione di usarlo

sono elencati nel file https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

Così abbiamo deciso di scrivere la nostra implementazione di PropertySourceLoader che sarebbe in grado di caricare correttamente le proprietà dal file UTF-8. L'idea è dalla risposta @BalusC - How to use UTF-8 in resource properties with ResourceBundle implementazione

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

} 

Poi abbiamo creato un file risorse/META-INF/primavera.fabbriche con il contenuto:

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

Ora abbiamo 3 PropertySourceLoader nella nostra applicazione in seguente ordine:

  • UnicodePropertiesPropertySourceLoader
  • PropertiesPropertySourceLoader
  • YamlPropertySourceLoader

NOTE!

  1. non sono sicuro che sia corretto utilizzo di PropertyResourceBundle
  2. non sono sicuro che l'ordine di PropertySourceLoaders in primavera avvio sarà lo stesso se si effettua una libreria dedicata a riutilizzarla in altri progetti.

Nel nostro progetto questa soluzione funziona correttamente.

AGGIORNAMENTO!

E 'meglio implementare il metodo carico di UnicodePropertiesPropertySourceLoader senza 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; 
} 
1

prega, cerca di aggiungere PropertySource annotazioni con il parametro di codifica nel file configuaration:

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

Speranza che aiuta.

Problemi correlati