Comment utiliser YamlPropertiesFactoryBean pour charger des fichiers YAML en utilisant Spring Framework 4.1?

J'ai une application spring qui utilise actuellement *.fichiers de propriétés et je veux l'avoir en utilisant des 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 suis pas sûr de savoir 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 méthode setBeanFactory .

Auparavant, je chargeais des 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 YamlPropertiesFactoryBean dans PropertySourcesPlaceholderConfigurer afin que je puisse charger directement les fichiers YAML? Ou y a-t-il une autre façon de le faire?

Merci.

Mon application utilise la configuration basée sur les annotations et j'utilise Spring Framework 4.1.4. J'ai trouvé des informations mais ça m'a toujours pointé vers le printemps Boot, comme celui-ci .

25
demandé sur ktulinho 2015-02-03 19:20:25

2 réponses

Avec XML config j'ai utilisé 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 de classe 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:
configuration java 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;
}
50
répondu turtlesallthewaydown 2016-05-24 14:23:03

, ainsi conçu .fichier yml au Printemps, vous pouvez utiliser l'approche suivante.

Par exemple, vous avez ceci .fichier yml:

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

Définissez ensuite 2 POJOs 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.
}

Maintenant, vous pouvez autowire ces haricots dans votre composant. Par exemple:

@Component
public class MyPropertiesAggregator {

    @Autowired
    private MyCustomSection1 section;
}

Si vous utilisez Spring Boot, tout sera automatiquement scanné 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 y a un échantillon de test configuration:

@SpringApplicationConfiguration(MainBootApplication.class)
public abstract class BaseITTest extends AbstractTestNGSpringContextTests {
    ....
}
1
répondu ayurchuk 2016-12-28 13:52:46