La codifica UTF-8 di applicazione.proprietà attributi in Primavera-Boot

Nel mio application.properties aggiungere attributi personalizzati.

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 vedo che I miei this.getSubjectMessage() variabile ha questo valore all’interno: This is a ä ö ü à problem. Quindi, prima di inviare la mia e-mail che ho già una codifica UTF-8 problema.

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

Mio IDE(M/Eclipse) e la proprietà del progetto sono anche l’UTF-8.

Come posso impostare la codifica UTF-8 per il testo del mio attributi personalizzati in application.properties file?

  • Mi ricordo di aver letto da qualche parte che Java si aspetta che *.properties file sono codificati in ISO-8859-1 e per questo motivo Molla tratta application.properties come se fosse in ISO-8859-1. Vedere questa domanda: Primavera di Avvio di default proprietà di codifica cambiare?. Possibile soluzione: Utilizzare YAML invece di file di proprietà.
  • sì, ho controllato questa risposta, troppo. Ancora sperando forse c’è un’altra soluzione per i file di proprietà.
InformationsquelleAutor Patrick | 2016-05-25



4 Replies
  1. 19

    Come già accennato nei commenti .i file di proprietà dovrebbero essere codificati in ISO 8859-1. Si può usare unicode sfugge per specificare altri personaggi. C’è anche un strumento a disposizione per fare la conversione. Questo può essere usato, ad esempio nella costruzione automatica in modo che è possibile continuare ad utilizzare il vostro preferito codifica di sorgente.

    • upvote per l’utilizzo di unicode sfugge per una soluzione alternativa
    • Fantastico, grazie, ma questa risposta sarebbe meglio con un esempio di come i caratteri codificati aspetto dell’applicazione.proprietà: l’abitudine.mail.proprietà.oggetto del messaggio=Questa è un \u00E4 \u00F6 \u00FC \u00DF problema
  2. 14

    Si prega di provare ad aggiungere PropertySource annotazione con la codifica parametro nel Configuaration file:

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

    Speranza che aiuta.

    • Assolutamente si adatta)
  3. 8

    Ho dovuto affrontare lo stesso problema.
    Nella Primavera del Boot ci sono 2 PropertySourceLoader che vengono utilizzati per caricare le proprietà di applicazione:

    • PropertiesPropertySourceLoader – supporta UTF-8 solo quando il carico da XML
    • YamlPropertySourceLoader – supporta UTF-8, ma è necessario modificare la configurazione del formato da utilizzare è

    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 proprietà da UTF-8 file correttamente. L’idea è da rispondere a @BalusC – Come utilizzare UTF-8 in proprietà di risorse con ResourceBundle

    Nostro PropertySourceLoader attuazione:

    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 contenuto:

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

    Ora abbiamo 3 PropertySourceLoader nella nostra applicazione, nel seguente ordine:

    • UnicodePropertiesPropertySourceLoader
    • PropertiesPropertySourceLoader
    • YamlPropertySourceLoader

    NOTE!

    1. Non sono sicuro che sia corretto utilizzo di PropertyResourceBundle
    2. Io non sono sicuro di che ordine di PropertySourceLoaders in Primavera Avvio sarà lo stesso se si effettua una libreria dedicata a riutilizzare in altri progetti.

    Nel nostro progetto, questa soluzione funziona bene.

    AGGIORNAMENTO!

    È meglio implementare il metodo di caricamento 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;
    }
  4. 2

    Per impostare la codifica UTF-8 per il testo nell’applicazione.proprietà (e di qualsiasi altra proprietà di Java così come le variabili di ambiente) aggiungere -Dfile.encoding=UTF-8 a riga di comando java agrs.

    • Penso che ciò non è semplice, soprattutto prima di Java 9
    • Sì, è possibile. Io uso questo flag per la Primavera di applicazione di lettura.proprietà e variabili di ambiente di sistema in unicode con Java 8. Per esempio l’IDEA di aggiungere questa bandiera automaticamente. /usr/java/jdk1.8.0_181/bin/java ... -Dfile.encoding=UTF-8 -classpath ... test.hello.TestHello
    • Come effetto collaterale di applicazioni Java in esecuzione in finestra Mobile contenitore con -Dfile.encoding=UTF-8 produce un output leggibile in unicode invece di punti interrogativi. Quindi, questo magico bandiera risolve entrambi i problemi, senza alcuna riga di codice. C’è un topic che spiega alcuni dettagli stackoverflow.com/questions/361975/…

Lascia un commento