web-dev-qa-db-fra.com

Propriétés de démarrage du printemps @Value

J'ai une application Spring Boot et dans l'une des classes, j'essaie de référencer une propriété du fichier application.properties à l'aide de @Value. Mais, la propriété ne soit pas résolue. J'ai consulté des publications similaires et essayé de suivre les suggestions, mais cela n'a pas aidé. Le cours est:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

J'ai la propriété file.directory dans application.properties. J'ai aussi d'autres domaines.

23
user6641655

J'ai eu le même problème que toi. Voici mon code d'erreur.

@Component
public class GetExprsAndEnvId {
    @Value("hello")
    private String Mysecret;


    public GetExprsAndEnvId() {
        System.out.println("construct");
    }


    public void print(){
        System.out.println(this.Mysecret);
    }


    public String getMysecret() {
        return Mysecret;
    }

    public void setMysecret(String mysecret) {
        Mysecret = mysecret;
    }
}

Ce n'est pas un problème comme celui-ci, mais il faut l'utiliser

@Autowired
private GetExprsAndEnvId getExprsAndEnvId;

pas comme ça:

getExprsAndEnvId = new GetExprsAndEnvId();
14
牛向辉

Assurez-vous que votre fichier application.properties se trouve sous src/main/resources/application.properties. Est un moyen d'aller. Ajoutez ensuite @PostConstruct comme suit

Exemple Application.properties

file.directory = somePlaceOverHere

Exemple de classe Java

@ComponentScan
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  @PostConstruct
  public void print() {
    System.out.println(fileDirectory);
  }
}

Le code ci-dessus imprimera "somePlaceOverhere"

11
Jesse

Je voudrais mentionner que j’ai utilisé la version 1.4.0 de Spring Boot et depuis cette version, vous ne pouvez écrire que

@Component
public class MongoConnection {

@Value("${spring.data.mongodb.Host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;
}

Puis injectez la classe quand vous voulez.

7
Peter S.

Pour lire les valeurs de application.properties, nous devons simplement annoter notre classe principale avec @SpringBootApplication et la classe où vous lisez avec @Component ou une variété de celle-ci. Vous trouverez ci-dessous un exemple où j'ai lu les valeurs de application.properties et qui fonctionne correctement lorsque le service Web est appelé. Si vous déployez le même code tel qu'il est et essayez d'accéder depuis http: // localhost: 8080/hello , vous obtiendrez la valeur que vous avez stockée dans application.properties pour le message de clé.

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${message}")
    private String message;

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

    @RequestMapping("/hello")
    String home() {
        return message;
    }

}

Essayez de me le faire savoir

1
rajadilipkolli

Vous n'avez pas inclus les déclarations de package dans l'OP, mais il est possible que ni @SpringBootApplication ni @ComponentScan ne recherchent votre @Component

Le @ComponentScan Javadoc indique:

basePackageClasses ou basePackages (ou son alias value) peut être spécifié pour définir des paquets spécifiques à analyser. Si des paquets spécifiques ne sont pas définis, l'analyse se fera à partir du package de la classe qui déclare cette annotation.

ISTR perdait beaucoup de temps à ce sujet auparavant et trouvait plus facile de déplacer simplement ma classe d'application vers le package le plus élevé dans l'arborescence de mon application.

Plus récemment, j’ai rencontré un piège dans lequel la propriété était lue avant l’insertion de la valeur. La réponse de Jesse a aidé, car @PostConstruct semble être le premier à pouvoir lire les valeurs insérées, et bien sûr, vous devriez laisser Spring appeler ceci.

0
Simon Gibbs

Comme vous utilisez le démarrage de printemps, la seule façon dont je pense qu’il ne fonctionne pas actuellement est que vous n’avez pas ajouté l’annotation @PropertySource.

S'il vous plaît essayez-le et laissez-moi savoir vos commentaires. Merci!

@Configuration
@ComponentScan
@PropertySource("classpath:/application.properties")
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}
0
kukkuz

Votre problème est que vous avez besoin d'une définition de beanstaticPropertySourcesPlaceholderConfigurer__ dans votre configuration. Je dis statique avec emphase, parce que j'avais un non-statique et ça n'a pas fonctionné.

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
0
Dormouse

J'ai eu le même problème et les exemples ci-dessus ne m'aident pas à lire les propriétés. J'ai posté la classe complète qui vous aidera à lire les valeurs des propriétés du fichier application.properties dans l'application SpringBoot dans le lien ci-dessous.

Spring Boot - Environment @Autowired lève NullPointerException

0
Nallamachu