2017-10-18 3 views
1

je le code suivant dans un échantillon Spring Boot application@Value avec SPEL pas en mesure d'obtenir des valeurs des propriétés

@Configuration 
@PropertySource("classpath:second.properties") 
public class PropertyConfig { 

    @Value("#{guru.username}") 
    String user; 

    @Value("#{guru.password}") 
    String password; 

    @Value("#{guru.url}") 
    String url; 


    @Bean 
    FakeDataSource getFakeDataSource() { 
     FakeDataSource fk = new FakeDataSource(); 

     fk.setName(user); 
     fk.setPassword(password); 
     fk.setUrl(url); 

     return fk; 
    } 

    @Bean 
    PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() { 
     PropertySourcesPlaceholderConfigurer placeholderConfigurer= new PropertySourcesPlaceholderConfigurer(); 
     //placeholderConfigurer.setLocation(new ClassPathResource("second.properties")); 

     return placeholderConfigurer; 
    } 
} 

Et FakeDataSource est un simple POJO avec le nom, passowrd, propriétés url.

Ensuite, mon application principale

@SpringBootApplication 
public class SpringGuru101DependencyInjectionApplication { 
    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(SpringGuru101DependencyInjectionApplication.class, args); 

     // Step 2: Make Class 
     FakeDataSource fakeDataSource = ctx.getBean(FakeDataSource.class); 

     System.out.println(fakeDataSource.getName()); 
    } 
} 

mais l'instruction Sout est l'impression null, mon fichier second.properties est présent dans mon répertoire des ressources avec le contenu suivant

guru.username=Saurabh 
guru.password=ido 
guru.url=http://example.com 
+0

essayer '@ImportResource ("classpath: second.properties") ' –

+0

Veuillez essayer de remplacer le signe de tête de puits (#) par le signe dollar ($) pour lire la valeur de votre fichier de configuration. Par exemple: '@Value (" $ {guru.username} ")' – LHCHIN

+0

L'application @ScaryWombat n'a pas pu être compilée si j'utilise @ImportSource (_classpath_) 'org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Ligne 1 dans Le document XML de la ressource de chemin de classe [second.properties] n'est pas valide; l'exception imbriquée est org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Le contenu est interdite dans prolog.' – Saurabh

Répondre

1

Il y a deux endroits devraient corrigé:
(1) Comme je l'ai dit dans le commentaire de votre question, vous devriez remplacer le signe de tête de puits (#) par le signe dollar ($) pour lire les valeurs de votre fichier de configuration. Par exemple: @Value("${guru.username}").

(2) Vous avez manqué public static devant la méthode getPropertySourcesPlaceholderConfigurer.
Et cette méthode modifiée devrait être considérée comme la manière suivante:

@Bean 
public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer placeholderConfigurer= new PropertySourcesPlaceholderConfigurer(); 
    //placeholderConfigurer.setLocation(new ClassPathResource("second.properties")); 

    return placeholderConfigurer; 
} 
+0

merci ...J'ai vérifié et cela a fonctionné :) – Saurabh

0

Si vous utilisez Spring-boot, vous pouvez utiliser une autre méthode de lecture de la configuration qui est démarrage de printemps recommandé. Cela vous aidera à vous débarrasser de toutes les notations @Value, permettant des propriétés d'injection de ressort sans conseils supplémentaires.

Vous pouvez potentiellement faire quelque chose comme:

@ConfigurationProperties("foo") 
public class FooProperties { 

private boolean enabled; 

private InetAddress remoteAddress; 

private final Security security = new Security(); 

public boolean isEnabled() { ... } 

public void setEnabled(boolean enabled) { ... } 

public InetAddress getRemoteAddress() { ... } 

public void setRemoteAddress(InetAddress remoteAddress) { ... } 

public Security getSecurity() { ... } 

public static class Security { 

    private String username; 

    private String password; 

    private List<String> roles = new ArrayList<>(Collections.singleton("USER")); 

    public String getUsername() { ... } 

    public void setUsername(String username) { ... } 

    public String getPassword() { ... } 

    public void setPassword(String password) { ... } 

    public List<String> getRoles() { ... } 

    public void setRoles(List<String> roles) { ... } 

} 

}

Le POJO ci-dessus définit les propriétés suivantes:

foo.enabled, faux par défaut foo.remote adresse, avec un type qui peut être forcé à partir de String foo.security.username, avec une "sécurité" imbriquée dont le nom est déterminé par le nom de la propriété. En particulier, le type de retour n'est pas du tout utilisé et il aurait pu être SecurityProperties foo.security.password foo.security.roles, avec une collection de cordes

Plus de détails: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

+0

Afaik ceci est recommandé si vous voulez que beaucoup de champs correspondent avec la classe de propriétés de dire "foo.xxx", mais pas quand vous travaillez avec 1 propriété spécifique – Saurabh