web-dev-qa-db-fra.com

Comment utiliser YamlPropertiesFactoryBean pour charger des fichiers YAML à l'aide de Spring Framework 4.1?

J'ai une application de printemps qui utilise actuellement des fichiers * .properties et je veux l'avoir à l'aide de fichiers YAML à la place.

J'ai trouvé la classe YamlPropertiesFactoryBean qui semble être capable de faire ce dont j'ai besoin. 

Mon problème est que je ne sais pas comment utiliser cette classe dans mon application Spring (qui utilise une configuration basée sur des annotations) . Il semble que je devrais le configurer dans le PropertySourcesPlaceholderConfigurer avec le setBeanFactory méthode.

Auparavant, je chargeais les fichiers de propriétés en utilisant @PropertySource comme suit:

@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

Comment puis-je activer le YamlPropertiesFactoryBean dans le PropertySourcesPlaceholderConfigurer afin de pouvoir charger directement des fichiers YAML? Ou y a-t-il une autre façon de faire cela?

Merci.

Mon application utilise une configuration basée sur des annotations et j'utilise Spring Framework 4.1.4. J'ai trouvé des informations mais elles m'ont toujours indiqué Spring Boot, comme this celui-ci .

28
ktulinho

Avec la configuration XML, j'utilise cette construction:

<context:annotation-config/>

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources" value="classpath:test.yml"/>
</bean>

<context:property-placeholder properties-ref="yamlProperties"/>

Bien sûr, vous devez avoir la dépendance snakeyaml sur votre chemin d'accès aux classes d'exécution.

Je préfère la configuration XML à la configuration Java, mais je reconnais qu'il ne devrait pas être difficile de la convertir.

modifier:
Java config par souci d'exhaustivité

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
  PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
  YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
  yaml.setResources(new ClassPathResource("default.yml"));
  propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
  return propertySourcesPlaceholderConfigurer;
}
59

`

package com.yaml.yamlsample;

import com.yaml.yamlsample.config.factory.YamlPropertySourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@PropertySource(value = "classpath:My-Yaml-Example-File.yml", factory = YamlPropertySourceFactory.class)
public class YamlSampleApplication implements CommandLineRunner {

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

    @Value("${person.firstName}")
    private String firstName;
    @Override
    public void run(String... args) throws Exception {
        System.out.println("first Name              :" + firstName);
    }
}


package com.yaml.yamlsample.config.factory;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import Java.io.IOException;
import Java.util.List;

public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException {
         if (resource == null) {
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> propertySourceList = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        if (!propertySourceList.isEmpty()) {
            return propertySourceList.iterator().next();
        }
        return super.createPropertySource(name, resource);
    }
}

My-Yaml-Example-File.yml

person:
  firstName: Mahmoud
  middleName:Ahmed

Référencez mon exemple sur github spring-boot-yaml-sample Vous pouvez donc charger des fichiers yaml et injecter des valeurs à l'aide de @Value ()

0
Mahmoud Eltayeb

Pour lire le fichier .yml au printemps, vous pouvez utiliser l’approche suivante.

Par exemple, vous avez ce fichier .yml:

section1:
  key1: "value1"
  key2: "value2"
section2:
  key1: "value1"
  key2: "value2"

Définissez ensuite 2 POJO Java:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section1")
public class MyCustomSection1 {
    private String key1;
    private String key2;

    // define setters and getters.
}

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section2")
public class MyCustomSection1 {
    private String key1;
    private String key2;

    // define setters and getters.
}

Vous pouvez maintenant connecter automatiquement ces haricots à votre composant. Par exemple:

@Component
public class MyPropertiesAggregator {

    @Autowired
    private MyCustomSection1 section;
}

Si vous utilisez Spring Boot, tout sera automatiquement analysé et instancié:

@SpringBootApplication
public class MainBootApplication {
     public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(MainBootApplication.class)
            .bannerMode(OFF)
            .run(args);
     }
}

Si vous utilisez JUnit, il existe une configuration de test de base pour charger le fichier YAML:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MainBootApplication.class)
public class MyJUnitTests {
    ...
}

Si vous utilisez TestNG, il existe un exemple de configuration de test:

@SpringApplicationConfiguration(MainBootApplication.class)
public abstract class BaseITTest extends AbstractTestNGSpringContextTests {
    ....
}
0
ayurchuk