web-dev-qa-db-fra.com

Application de démarrage de printemps et MessageSource

J'ai essayé de créer une application de démarrage printanière de démonstration avec MessageSource, mais je ne pouvais pas comprendre quel était le problème. J'ai essayé de plusieurs manières:

  • MessageSourceAutoConfiguration
  • Créer mon propre bean dans un fichier @configuration et le transférer automatiquement

Ci-dessous vous trouverez la méthode MessageSourceAutoConfiguration:

J'utilise spring-boot-starter-parent 1.5.7.RELEASE.

Ma structure de dossier:

 enter image description here

DemoApplication.Java

@SpringBootApplication
public class DemoApplication
{
  public static void main(String[] args)
  {
    SpringApplication.run(DemoApplication.class, args);
  }
}

DemoController.Java

@RestController
public class DemoController implements MessageSourceAware
{
  private MessageSource messageSource;

  @Override
  public void setMessageSource(MessageSource messageSource)
  {
    this.messageSource = messageSource;
  }

  @RequestMapping("demo")
  public String getLocalisedText()
  {
    return messageSource.getMessage("test", new Object[0], new Locale("el"));
  }
}

Application.yml

spring:
  messages:
    basename: messages

messages.properties

test=This is a demo app!

messages_el.properties

test=This is a greek demo app!

pom.xml

<groupId>com.example.i18n.demo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
    <relativePath />
    <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-
    8</project.reporting.outputEncoding>
    <Java.version>1.8</Java.version>
</properties>

<dependencies>      
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Lors du démarrage du serveur, je constate que la configuration automatique fonctionne mais ne trouve pas de bean:

MessageSourceAutoConfiguration matched:
      - ResourceBundle found bundle URL [file:/C:/Users/{user}/Downloads/demo/demo/target/classes/messages.properties] (MessageSourceAutoConfiguration.ResourceBundleCondition)
      - @ConditionalOnMissingBean (types: org.springframework.context.MessageSource; SearchStrategy: current) did not find any beans (OnBeanCondition)

J'ai aussi essayé de déclarer explicitement mon propre haricot, mais cela n'a pas fonctionné.

Lors de l'appel du noeud final, l'erreur suivante apparaît:

{
    "status": 500,
    "error": "Internal Server Error",
    "exception": "org.springframework.context.NoSuchMessageException",
    "message": "No message found under code 'test' for locale 'el'.",
    "path": "/demo"
}

La question SO la plus proche que j'ai trouvée était celle-ci (2 ans) à propos d'un bogue du printemps corrigé quelques versions auparavant: Spring Boot MessageSourceAutoConfiguration

8
nicolas

Le problème était ma configuration d'encodage Eclipse, que je n'ai pas encore réussi à corriger. 

Après le débogage du code de spring ( ReloadableResourceBundleMessageSource.Java ), je pouvais voir ma propriété key = value chargée, mais avec 3 caractères d'espacement avant chaque caractère ("c'est ce que je veux dire.".

Sur un autre ordinateur, la même application de démonstration fonctionne très bien. 

0
nicolas

Pouvez-vous créer un paquet de messages dans les ressources et essayer cette implémentation de Bean dans votre fichier de configuration:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setCacheSeconds(10); //reload messages every 10 seconds
    return messageSource;
}

De plus, je vous suggère d'utiliser les classes de configuration annotées @Configuration au lieu des fichiers xml pour une adaptation parfaite au concept Spring Boot.

17
ahmetcetin