2016-05-25 22 views
10

W moim application.properties dodaję niektóre atrybuty niestandardowe.Kodowanie UTF-8 atrybutów application.properties w Spring-Boot

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

W tej klasie mam reprezentację niestandardowych atrybutów.

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

I tu mogę korzystać 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(); 
     } 
    } 

Podczas debugowania widzę, że moja zmienna this.getSubjectMessage() ma tę wartość Wewnątrz: This is a ä ö ü à problem. Tak więc przed wysłaniem mojej poczty mam już problem z kodowaniem UTF-8.

Sprawdziłem już kodowanie pliku application.properties i jego UTF-8.

Moje IDE (STS/Eclipse) i właściwości projektu są również ustawione na UTF-8.

Jak ustawić kodowanie UTF-8 dla tekstu moich atrybutów niestandardowych w pliku application.properties?

+2

Pamiętam, że czytałem gdzieś, że Java spodziewa się, że pliki '* .properties' są zakodowane w ISO-8859-1 i dlatego Spring traktuje' application.properties' jak w ISO-8859-1. Zobacz pytanie: [zmiana ustawień domyślnych Spring Boot?] (Http://stackoverflow.com/questions/27882191/spring-boot-default-properties-encoding-change). Możliwe rozwiązanie: użyj plików YAML zamiast plików właściwości. – Jesper

+0

@Jesper tak, sprawdziłem też tę odpowiedź. Wciąż mam nadzieję, że istnieje może inne rozwiązanie dla plików właściwości. – Patrick

Odpowiedz

12

Jak już wspomniano w plikach komentarzy .properties oczekuje się, że będą zakodowane w ISO 8859-1. Można użyć znaków ucieczkowych Unicode, aby określić inne znaki. Dostępny jest również tool do wykonania konwersji. Może to być na przykład użyte w automatycznej kompilacji, dzięki czemu nadal możesz używać swojego ulubionego kodowania w źródle.

+0

upvote o używaniu ucieczki unicode dla obejścia – Patrick

6

Mam do czynienia z tym samym problemem. Wiosną Boot istnieją 2 PropertySourceLoader które służą do ładowania właściwości w zastosowaniu:

  • PropertiesPropertySourceLoader - obsługuje UTF-8 tylko wtedy, gdy obciążenie z XML
  • YamlPropertySourceLoader - obsługuje UTF-8, ale trzeba zmienić format konfiguracji, aby używać go

Są one wymienione w pliku https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/META-INF/spring.factories

Postanowiliśmy więc napisać własną implementację PropertySourceLoader, która byłaby w stanie poprawnie załadować właściwości z pliku UTF-8. Chodzi o to, ze odpowiedzi @BalusC - How to use UTF-8 in resource properties with ResourceBundle realizacja

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

} 

Następnie stworzyliśmy plik resources/META-INF/wiosna.fabryki z treścią:

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

Teraz mamy 3 PropertySourceLoader w naszej aplikacji w następującej kolejności:

  • UnicodePropertiesPropertySourceLoader
  • PropertiesPropertySourceLoader
  • YamlPropertySourceLoader

UWAGI!

  1. Nie jestem pewien, że to jest właściwe wykorzystanie PropertyResourceBundle
  2. Nie jestem pewien, że kolejność PropertySourceLoaders w Spring Boot będzie takie samo, jeśli uczynić dedykowaną bibliotekę do ponownego wykorzystania go w innych projektach.

W naszym projekcie to rozwiązanie działa dobrze.

AKTUALIZACJA!

Lepiej wdrożyć metodę ładowania UnicodePropertiesPropertySourceLoader bez 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

Proszę, spróbuj dodać PropertySource adnotacji z parametrem kodowania w pliku dotyczących konfiguracji:

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

Nadzieję, że to pomaga.