it-swarm.com.de

Wie verwendet man YamlPropertiesFactoryBean, um YAML-Dateien mit Spring Framework 4.1 zu laden?

Ich habe eine Frühlingsanwendung, die derzeit * .properties-Dateien verwendet, und ich möchte stattdessen YAML-Dateien verwenden.

Ich habe die Klasse YamlPropertiesFactoryBean gefunden, die in der Lage ist zu tun, was ich brauche. 

Mein Problem ist, dass ich nicht sicher bin, wie ich diese Klasse in meiner Spring-Anwendung (die auf Annotation basierende Konfiguration verwendet) verwendet .. .. Es scheint, dass ich sie im PropertySourcesPlaceholderConfigurer mit der setBeanFactory Methode.

Zuvor habe ich Eigenschaftsdateien mit @PropertySource wie folgt geladen:

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

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

Wie kann ich die YamlPropertiesFactoryBean im PropertySourcesPlaceholderConfigurer aktivieren, damit ich YAML-Dateien direkt laden kann? Oder gibt es einen anderen Weg, dies zu tun?

Vielen Dank.

Meine Anwendung verwendet eine Annotation-basierte Konfiguration, und ich verwende Spring Framework 4.1.4. Ich fand einige Informationen, aber es zeigte mir immer Spring Boot, wie dieses .

28
ktulinho

Mit XML-Konfig habe ich dieses Konstrukt verwendet:

<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"/>

Natürlich müssen Sie die snakeyaml-Abhängigkeit von Ihrem Laufzeitklassenpfad haben.

Ich bevorzuge die XML-Konfiguration der Java-Konfiguration, aber ich finde, es sollte nicht schwer sein, sie zu konvertieren.

bearbeiten:
Java-Konfig der Vollständigkeit halber

@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

Ich verbringe 5 bis 6 Stunden damit zu verstehen, warum die externe Konfiguration der yml/yaml-Datei (nicht application.yml) so unterschiedlich ist. Ich habe verschiedene Artikel gelesen, Fragen zum Stapelüberlauf gestellt, aber keine richtige Antwort erhalten.

Ich steckte dazwischen, als könnte ich mit YamlPropertySourceLoader einen benutzerdefinierten Wert für eine yml-Datei verwenden, aber nicht mit @Value, weil mir ein Fehler wie angezeigt wird. verschachtelte Ausnahme ist Java.lang.IllegalArgumentException: Platzhalter 'fullname.firstname' im Wert "$ {fullname.firstname}" konnte nicht aufgelöst werden

fullname ist eine Eigenschaft in yml.

Dann habe ich die oben angegebene Lösung "turtlesallthewaydown" verwendet, dann konnte ich @Value ohne Probleme für Yaml-Dateien verwenden und habe YamlPropertySourceLoader entfernt.

Jetzt verstehe ich den Unterschied zwischen YamlPropertySourceLoader und PropertySourcesPlaceholderConfigurer, ein großes Dankeschön, jedoch habe ich diese Änderungen in mein Git-Repo eingefügt.

Git Repo: https://github.com/Atishay007/spring-boot-with-restful-web-services

Klassenname: SpringMicroservicesApplication.Java

1
Atishay Jain

`

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);
    }
}

Meine-Yaml-Beispieldatei.yml

person:
  firstName: Mahmoud
  middleName:Ahmed

Verweise auf mein Beispiel zu github spring-boot-yaml-sample So können Sie yaml-Dateien laden und Werte mit @Value () einfügen

0
Mahmoud Eltayeb

Um die .yml-Datei in Spring zu lesen, können Sie den nächsten Ansatz verwenden.

Zum Beispiel haben Sie diese .yml-Datei:

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

Definieren Sie dann 2 Java-POJOs:

@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.
}

Jetzt können Sie diese Beans in Ihrer Komponente automatisch aktivieren. Zum Beispiel:

@Component
public class MyPropertiesAggregator {

    @Autowired
    private MyCustomSection1 section;
}

Falls Sie Spring Boot verwenden, wird alles automatisch gescannt und instanziiert:

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

Wenn Sie JUnit verwenden, gibt es eine grundlegende Testeinrichtung zum Laden der YAML-Datei:

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

Wenn Sie TestNG verwenden, finden Sie ein Beispiel für die Testkonfiguration:

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