2017-04-11 9 views
0

yamlファイルから特定のオブジェクトのリストをロードする簡単な方法はありますか?スプリングロードyamlリスト値

list: 
    - 
    name: a 
    url: a.com 
    - 
    name: b 
    url: b.com 

を、私は、このプロパティからList<Endpoints>を作成したいと思います:だから、例えば私はそのような構成でyamlファイルを持っています。私は春のブートと@ConfigurationProperties注釈を使用して非常に簡単に知っていますが、私はちょうど春を使用してこれを行うことができますか?

答えて

1

これはどうですか。

YMLファイル

list: 'a,a.com;b,b.com' 

コンポーネントクラス

@Value("#{T(org.blah.spring.service.Endpoint).getEndpoints('${list}'.split(';'))}") 
    List<Endpoint> endpoints; 

とエンドポイント

@Getter 
@Setter 
@AllArgsConstructor 
public class Endpoint { 

    private String name; 
    private String url; 

    public static List<Endpoint> getEndpoints(List<String> strings){ 
    List<Endpoint> endpoints = Lists.newArrayList(); 

    for(String s: strings){ 
     String split[] = s.split(","); 
     endpoints.add(new Endpoint(split[0], split[1])); 
    } 
    return endpoints; 
    } 
} 
1

あなたは(場合には、あなたが構築しているブート・フリーソリューションを探しているなら、私の答えを無視図書館)。

PropertiesConfigurationFactoryYamlPropertySourceLoaderと​​を使用すると、POJOにYamlファイルを読むことができます:あなたがデータソースを所有して

import org.junit.Test; 
import org.springframework.boot.bind.PropertiesConfigurationFactory; 
import org.springframework.boot.env.YamlPropertySourceLoader; 
import org.springframework.core.env.MutablePropertySources; 
import org.springframework.core.io.ByteArrayResource; 

import java.util.List; 

import static org.junit.Assert.assertTrue; 

public class YamlTest { 

    private static final String YAML_STRING = "list:   \n" + 
               " -   \n" + 
               " name: a \n" + 
               " url: a.com \n" + 
               " -   \n" + 
               " name: b \n" + 
               " url: b.com"; 

    @Test 
    public void shouldLoadYamlIntoObject() throws Exception { 
     PropertiesConfigurationFactory<EndpointsHolder> propertiesConfigurationFactory = new PropertiesConfigurationFactory<>(EndpointsHolder.class); 

     MutablePropertySources propertySources = new MutablePropertySources(); 
     YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader(); 

     propertySources.addFirst(yamlPropertySourceLoader.load("list", new ByteArrayResource(YAML_STRING.getBytes()), null)); 
     propertiesConfigurationFactory.setPropertySources(propertySources); 

     EndpointsHolder actual = propertiesConfigurationFactory.getObject(); 

     assertTrue(actual.getList().get(0).getName().equals("a")); 
     assertTrue(actual.getList().get(1).getUrl().equals("b.com")); 
    } 

    public static class EndpointsHolder { 

     List<Endpoints> list; 

     public List<Endpoints> getList() { 
      return list; 
     } 

     public void setList(List<Endpoints> list) { 
      this.list = list; 
     } 
    } 

    public static class Endpoints { 

     String name; 
     String url; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getUrl() { 
      return url; 
     } 

     public void setUrl(String url) { 
      this.url = url; 
     } 
    } 
} 

だけnew ByteArrayResource(YAML_STRING.getBytes())を交換してください。

関連する問題