web-dev-qa-db-fra.com

SpringBootApplication n'a pas pu charger les propriétés à partir du fichier application.yml

Classe de configuration,

@Configuration
public class SpringContext {
@Bean
public BlockingQueue<String> queue(@Value("${queue.size}") int queueSize) {
    return new LinkedBlockingQueue<>();
   }
}

Classe principale,

@SpringBootApplication
public class SpringContextTest {

    public static void main(String[] args) {
        final SpringApplication springApplication = new SpringApplication(SpringContext.class);
        springApplication.setWebEnvironment(false);
        springApplication.run();
        System.out.println("queue.size" + System.getProperty("queue.size"));
    }

}

application.yml,

queue.size: 10

En commençant la classe principale, j'obtiens l'erreur suivante,

Caused by: Java.lang.NumberFormatException: For input string: "${queue.size}"
    at Java.lang.NumberFormatException.forInputString(NumberFormatException.Java:65) ~[na:1.8.0_144]

Il me manque quelques annotations ?, Je crois comprendre que j’ai utilisé les annotations minimales requises pour une application de démarrage printanier. J’ai vu des messages similaires, mais je n’ai pas aidé. Aussi Essayé avec --spring.config.location .

Ma version de démarrage Spring: 1.3.6.RELEASE

6
Krishas

Votre fichier de configuration ressemble plus à un application.properties qu'à un application.yml

queue.size: 10

L'équivalent yml devrait être:

queue:
    size: 10

METTRE &AGRAVE; JOUR

Oui, les deux devraient fonctionner dans .yml vous avez raison. J'ai reproduit exactement votre exemple et cela a fonctionné!

Assurez-vous simplement que votre fichier application.yml se trouve à la racine du src/main/resources/. J'ai eu la même erreur que le vôtre quand j'avais le fichier application.yml dans un sous-répertoire, par exemple. src/main/resources/com/myapp/

2
pleft

Suppositions

Selon les informations actuelles que vous fournissez, je ne peux pas reproduire le problème. Voici donc quelques suppositions:

  • Vérifiez si le nom de fichier et l'emplacement du fichier application.yml sont corrects.
  • Essayez d'utiliser Spring EL: 

    @Value("#{applicationConfig['queue.size']}")
    
  • Essayez le chargement de la propriété de débogage:

    @Bean
    public BlockingQueue<String> queue(ConfigurableEnvironment env) {
      return new LinkedBlockingQueue<>(); // set breakpoint here, to see if env has your property in PropertySource: applicationConfig
    }
    

Plus

Plus d'informations sur property source et yaml loading dans mon blog.

Plus loin

Si les suggestions ne vous aident pas, vous pouvez mieux

  • fournir un exemple de projet pouvant reproduire le problème;
  • fournir une pile complète;
0
Tony

La section Externalized Configuration de la documentation Spring Boot explique tous les détails dont vous pourriez avoir besoin.

Selon votre exemple pour charger des propriétés dans la classe principale, vous pouvez faire quelque chose comme ceci,

  1. Commencez par vérifier l’emplacement du fichier yaml. Il devrait se trouver dans /src/main/resources/application.yaml.
  2. Le contenu devrait ressembler à l'exemple suivant,

     app: 
     valeur1: 12 
     valeur2: chaîneValeur 
    
  3. Exemple de code,

     package com.demo; 
     
     importer org.springframework.boot.SpringApplication; 
     importer org.springframework.boot.autoconfigure.SpringBootApplication; 
     import org.springframework.core.env.Environment; 
     
     @ SpringBootApplication 
     public class App {
     
    
    public static void main( String[] args ){
        SpringApplication app = new SpringApplication(App.class);
        Environment env = app.run(args).getEnvironment();
    
        String value1 = env.getProperty("app.value1");
        String value2 = env.getProperty("app.value2");
    
        System.out.println("---------------- "+value1);
        System.out.println("---------------- "+value2);
    
    }
    
    }
0
Manoj Janaka