2015-02-03 10 views
18

Mam aplikację źródłową, która obecnie używa plików * .properties i chcę ją używać w zamian za pliki YAML.Jak używać YamlPropertiesFactoryBean do ładowania plików YAML przy użyciu Spring Framework 4.1?

Znalazłem klasę YamlPropertiesFactoryBean, która wydaje się być zdolna do zrobienia tego, czego potrzebuję.

Mój problem polega na tym, że nie jestem pewien, jak używać tej klasy w mojej aplikacji Spring (która korzysta z konfiguracji opartej na adnotacjach). Wygląda na to, że powinienem skonfigurować go w metodzie PropertySourcesPlaceholderConfigurer za pomocą metody setBeanFactory.

Wcześniej byłem ładowania plików własności używając @PropertySource następująco:

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

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

Jak mogę włączyć YamlPropertiesFactoryBean w PropertySourcesPlaceholderConfigurer tak, że mogę załadować pliki YAML bezpośrednio? A może jest inny sposób robienia tego?

Dzięki.

Moja aplikacja używa konfiguracji opartej na adnotacjach i używam Spring Framework 4.1.4. Znalazłem trochę informacji, ale zawsze wskazywało to na Spring Boot, takie jak this one.

+0

Jeśli mój komentarz odpowie na twoje pierwsze pytanie, czy możesz to zaakceptować?Lub jeśli jest coś jeszcze, co mogę dodać, pozwól mi teraz. – turtlesallthewaydown

+0

@turtlesallthewaydown Dzięki za odpowiedź i przepraszam za opóźnienie w odpowiedzi. – ktulinho

Odpowiedz

44

XML config Używam tego konstruktu:

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

Oczywiście trzeba mieć zależność snakeyaml na ścieżce klas wykonawczego.

Preferuję konfigurację XML przez konfigurację java, ale muszę się przekonać, że nie powinno być trudno ją przekonwertować.

edit:
java config dla kompletności sake

@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

Dzięki za odpowiedź. Jak mogę teraz wprowadzić wartość z 'default.yml' do mojej klasy Java? Więc jeśli mój yml zawiera właściwość 'value: 60', czy mogę to zrobić w moim kodzie:' @Value ("$ {value}") private String value; '? – ktulinho

+1

Możesz użyć właściwości załadowanych z pliku yaml, tak jak byś użył zwykłego pliku .properties. Tak więc w dowolnej klasie zarządzanej przez Spring można rzeczywiście użyć dokładnego przykładu '@Value (" $ {value} ") private String value ', a zostanie ono wstrzyknięte. – turtlesallthewaydown

1

Aby przeczytać .yml plik wiosną można użyć następnego podejścia.

Na przykład masz ten plik .yml:

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

następnie zdefiniować 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. 
} 

Teraz można autowire te ziarna w komponencie. Na przykład:

@Component 
public class MyPropertiesAggregator { 

    @Autowired 
    private MyCustomSection1 section; 
} 

W przypadku korzystania Wiosna Boot wszystko zostanie automatycznie skanowane i wystąpienia:

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

Jeśli you'are użyciu JUnit jest podstawowa konfiguracja test ładowania pliku YAML:

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

Jeśli używasz TestNG jest próbka konfiguracji testowej:

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

Przepraszamy, ale Twój przykład dotyczy _Spring Boot_. Pytanie brzmi o _plain_ Spring Framework 4.1 –

+1

@ayurchuk Jak odczytać, że '.yaml' do obiektu' HashMap'? – niaomingjian

+1

@ayurchuk moja nazwa pliku to "myconfig.yaml". Ta metoda nie działa. Co powinienem zrobić? – niaomingjian

Powiązane problemy