2015-02-03 7 views
18

Ich habe eine Spring-Anwendung, die derzeit * .properties-Dateien verwendet und ich möchte stattdessen YAML-Dateien verwenden.Wie verwende ich YamlPropertiesFactoryBean zum Laden von YAML-Dateien mit Spring Framework 4.1?

Ich fand die Klasse YamlPropertiesFactoryBean, die in der Lage scheint zu tun, was ich brauche.

Mein Problem ist, dass ich nicht sicher bin, wie diese Klasse in meiner Spring-Anwendung (die Annotation-basierte Konfiguration verwendet) verwendet wird. Es scheint, ich sollte es in der PropertySourcesPlaceholderConfigurer mit der setBeanFactory Methode konfigurieren.

Früher war ich Ladegut Dateien mit @PropertySource wie folgt:

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

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

Wie kann ich die YamlPropertiesFactoryBean im PropertySourcesPlaceholderConfigurer aktivieren, so dass ich laden kann YAML-Dateien direkt? Oder gibt es eine andere Möglichkeit, dies zu tun?

Danke.

Meine Anwendung verwendet Annotation-basierte Konfiguration und ich verwende Spring Framework 4.1.4. Ich fand einige Informationen, aber es wies mich immer auf Spring Boot, wie this one.

+0

Wenn mein Kommentar Ihre erste Frage beantwortet, können Sie das akzeptieren?Oder wenn es noch etwas gibt, das ich hinzufügen kann, lass mich jetzt. – turtlesallthewaydown

+0

@turtlesallthewaydown Danke für Ihre Antwort und Entschuldigung für die Verzögerung in der Antwort. – ktulinho

Antwort

44

Mit XML-Konfigurations Ich habe mit diesem Konstrukt:

<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 können Sie die SnakeYAML Abhängigkeit von der Laufzeit Classpath haben müssen.

Ich bevorzuge XML-Konfiguration über die Java-Konfiguration, aber ich recon, es sollte nicht schwer sein, es zu konvertieren.

edit:
java Config für 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; 
} 
+2

Danke für Ihre Antwort. Wie kann ich nun einen Wert aus der 'default.yml' in meine Java-Klasse injizieren? Wenn mein Yml also eine Eigenschaft 'value: 60' enthält, kann ich das einfach in meinem Code tun:' @Value ("$ {value}") private String value; '? – ktulinho

+1

Sie können die aus der yaml-Datei geladenen Eigenschaften genauso verwenden wie die normale Datei .properties. Also können Sie in jeder von Spring verwalteten Klasse Ihr genaues Beispiel für den privaten String-Wert '@Value (" $ {value} ") verwenden und es wird injiziert. – turtlesallthewaydown

1

.yml Datei im Frühjahr lesen Sie nächste Ansatz.

Zum Beispiel haben Sie diese .yml Datei:

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

Dann 2 Java POJOs definieren:

@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 Bohnen in Ihrer Komponente autowire. Zum Beispiel:

@Component 
public class MyPropertiesAggregator { 

    @Autowired 
    private MyCustomSection1 section; 
} 

Im Fall verwenden Sie Frühlings-Boot alles wird automatisch scaned und instanziert wird:

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

Wenn you'are JUnit verwenden gibt es einen grundlegenden Testaufbau für das Laden YAML-Datei:

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

Wenn Sie mit TestNG gibt es eine Probe von Testkonfiguration:

@SpringApplicationConfiguration(MainBootApplication.class) 
public abstract class BaseITTest extends AbstractTestNGSpringContextTests { 
    .... 
} 
+8

Entschuldigung, aber Ihr Beispiel bezieht sich auf _Spring Boot_. Die Frage ist über _plain_ Spring Framework 4.1 –

+1

@ayurchuk Wie man das ".yaml" in ein 'HashMap' Objekt lesen? – niaomingjian

+1

@ayurchuk mein Dateiname ist 'myconfig.yaml'. Diese Methode funktioniert nicht. Was soll ich machen? – niaomingjian