web-dev-qa-db-fra.com

Le préfixe @ConfigurationProperties ne fonctionne pas

fichier .yml 

cassandra:
    keyspaceApp:junit
solr:
    keyspaceApp:xyz

Haricot 

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {
   @Value("${keyspaceApp:@null}") private String keyspaceApp;

Fichier de méthode principal 

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
public class CommonDataApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(CommonDataApplication.class)
                .web(false).headless(true).main(CommonDataApplication.class).run(args);
    }
}

Cas de test 

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CommonDataApplication.class)
@IntegrationTest
@EnableConfigurationProperties
public class CassandraClientTest {

    @Autowired
    CassandraClientNew cassandraClientNew;

    @Test
    public void test(){
        cassandraClientNew.getSession();
        System.out.println(" **** done ****");
    }
}

Au lieu de définir junit en tant que keyspaceApp, il définit xyz. 

On dirait que prefix = "cassandra" ne fonctionne pas 

23
plzdontkillme

On dirait que vous essayez d'utiliser Spring Boot Propriétés de configuration Typesafe feature.

Donc, pour qu'il fonctionne correctement, vous devez ajouter quelques modifications à votre code:

Tout d’abord, votre classe CommonDataApplication devrait avoir une annotation @EnableConfigurationProperties, par exemple.

@EnableAutoConfiguration
@ComponentScan
@PropertySource("application.yml")
@EnableConfigurationProperties
public class CommonDataApplication {

    public static void main(String[] args) {
        // ...
    }
}

Je ne pense pas que vous ayez besoin de l'annotation @PropertySource("application.yml") car application.yml (ainsi que application.properties et application.xml) est un fichier de configuration par défaut utilisé par Spring Boot.

Votre classe CassandraClientNew n'a pas besoin d'avoir la propriété @Value préfixant keyspaceApp. Et votre keyspaceAppdoit avoir une méthode de définition.

@Component
@ConfigurationProperties(prefix="cassandra")
public class CassandraClientNew {

   private String keyspaceApp;

   public void setKeyspaceApp(final String keyspaceApp) {
       this.keyspaceApp = keyspaceApp;
   }
}

En passant, si vous utilisez List's ou Sets et que vous initialisez des collections (par exemple, List<String> values = new ArrayList<>();), seul le getter est requis. Si une collection n'est pas initialisée, vous devez également fournir une méthode de définition (sinon, une exception sera levée).

J'espère que cela aidera.

44
Tom

Je ne sais pas d'où vient le "xyz" (peut-être que vous ne montrez pas tout votre application.yml?). Vous ne liez pas normalement avec @Value dans @ConfigurationProperties cependant (il n’a aucun moyen de savoir quel est votre préfixe). Avez-vous réellement @EnableCongigurationProperties quelque part? Utilisez-vous SpringApplication pour créer le contexte d'application?

1
Dave Syer

http://www.baeldung.com/configuration-properties-in-spring-boot

Cela ne fonctionne que pour moi avec SB 1.5.4-RELEASE. Simple avec juste ça. Voir le post ci-dessus pour plus d'informations.

@Configuration@ConfigurationProperties(prefix = "mail")public class ConfigProperties 

0
Breton F.