2015-09-15 9 views
28

Spring Boot uygulamasında aşağıdaki içeriğe sahip application.yaml yapılandırma dosyasına sahibim. Ben bu enjekte ediyorumSpring Boot'daki nesnelerin listesi için Yaml'de eşleme listesi

@ConfigurationProperties(prefix = "available-payment-channels-list") 
    @Configuration 
    @RefreshScope 
    public class AvailableChannelsConfiguration { 

     private String xyz; 

     private List<ChannelConfiguration> channelConfigurations; 

     public AvailableChannelsConfiguration(String xyz, List<ChannelConfiguration> channelConfigurations) { 
      this.xyz = xyz; 
      this.channelConfigurations = channelConfigurations; 
     } 

     public AvailableChannelsConfiguration() { 

     } 

     // getters, setters 


     @ConfigurationProperties(prefix = "available-payment-channels-list.channelConfigurations") 
     @Configuration 
     public static class ChannelConfiguration { 
      private String name; 
      private String companyBankAccount; 

      public ChannelConfiguration(String name, String companyBankAccount) { 
       this.name = name; 
       this.companyBankAccount = companyBankAccount; 
      } 

      public ChannelConfiguration() { 
      } 

      // getters, setters 
     } 

    } 

: istediğim

available-payment-channels-list: 
    xyz: "123" 
    channelConfigurations: 
    - 
     name: "Company X" 
     companyBankAccount: "1000200030004000" 
    - 
     name: "Company Y" 
     companyBankAccount: "1000200030004000" 

Ve @Configuration nesne PaymentConfiguration nesnelerin listesi ile doldurulması: Ben kanal yapılandırmaları listesini içeren bir yapılandırma nesnesi olarak enjekte sahip olmak istiyorum @Outowired kurucu ile normal bir fasulye. xyz Değeri doğru doldurulur, ancak Bahar nesnelerin listesine yaml ayrıştırmak çalıştığında ben

nested exception is java.lang.IllegalStateException: 
    Cannot convert value of type [java.lang.String] to required type  
    [io.example.AvailableChannelsConfiguration$ChannelConfiguration] 
    for property 'channelConfigurations[0]': no matching editors or 
    conversion strategy found] 

burada ne yanlış Herhangi ipuçları alıyorum?

+0

Tam olarak aynı sorun var: Ben bir çok şey denedim ama boş bir nesneyi veya aynı hatayı aldım ... Türün değerini dönüştüremiyor ... Dize .... MyObject ... eşleşen düzenleyiciler yok veya dönüşüm stratejisi bulundu. Garip bir şey, Spring Boot'da SnakeYAML parametrelerini veya davranışlarını etkileyebilecek hiçbir şey değiştirmedim ... Aslında, ne halt? – Alex

+0

Neredeyse unutuyordum, Spring Boot kullanıyorum 1.2.6 – Alex

cevap

9

nedeni başka bir yerde olmalı. Hiçbir önyükleme olmadan kutunun dışında yalnızca 1,12 Boot Boot'ı kullanarak, Just Works. Bu repoya bir göz atın - kırmak için alabilir misin?

https://github.com/konrad-garus/so-yaml

Eğer YAML dosyası yapıştırılan yolu tam olarak görünüyor emin misin? Fazladan boşluk, karakter, özel karakter, yanlış girinti veya bu tür bir şey yok mu? Arama yolunda başka bir yerde beklediğinizin yerine kullanılan başka bir dosya var mı?

+0

Aynı ve temiz SpringBoot projesi için çalıştım. Farklı ortamlar için mülk yüklemesinin özelleştirilmesinin düzgün davranmadığı ortaya çıktı. Araç sınıfı için –

11
  • Sen @Configuration ile kullanırken bazı sorunlar var iç sınıfları
  • RefreshScope
  • açıklama gerekmez kurucular
  • gerekmez. this github issue
böyle sınıfınızı değiştirme

bakın:

@ConfigurationProperties(prefix = "available-payment-channels-list") 
@Configuration 
public class AvailableChannelsConfiguration { 

private String xyz; 
private List<ChannelConfiguration> channelConfigurations; 

// getters, setters 

public static class ChannelConfiguration { 
    private String name; 
    private String companyBankAccount; 

    // getters, setters 
} 

} 
+0

Aynı şeyler, genellikle sizin kod sadece benim yuvalanmış istisnasının bir sadeleştirme java.lang.IllegalStateException: type [java.lang.String] değerine dönüştürülemiyor 'channelConfigurations [0]' özelliği için gereken tür [io.example.available_channels.AvailableChannelsConfiguration $ ChannelConfiguration]: eşleşen düzenleyiciler veya dönüşüm stratejisi bulunamadı] –

+0

Kodu çalıştırdım ve atanan tüm değerleri görüyorum. RefreshScope açıklamasını kaldırdınız mı –

+0

Ve bahar önyükleme sürümünüz nedir? –

4

Bende bununla ilgili çok fazla sorun vardı. Son olarak neyin nesi olduğunu öğrendim.

@Gokhan Oner yanıtına başvurduğunuzda, Hizmet sınıfınızı ve POJO'nuzu nesnenizi temsil ettikten sonra, YAML yapılandırma dosyanızı hoş ve yalın bir şekilde kullanırsanız, @ConfigurationProperties ek açıklamasını kullanırsanız, nesneyi açıkça almanız gerekir. onu kullanabilmek. Gibi:

Ve işte başlıyorsunuz. Cehennem kadar basit, ama bilmeliyiz ki nesne alıcısını çağırmalıyız. Nesnenin değeri ile inşa edilmesini istemek, ama hayır, başlangıçta bekliyordum. Umarım yardımcı olur :)

3

Bu makaleyi ve daha birçoğunu atıfta bulunmuştum ve yardım için açık ve özlü bir yanıt bulamadım.

İlkbahar-Boot sürümü: 1.3.5.RELEASE

Bahar Çekirdekli sürümü: 4.2.6.RELEASE

Ben aşağıdaki, bu iplikten referans için geldi, benim keşif öneriyorum

Bağımlılık Yönetimi: Brixton.Bir Tools.class

tools: 
    toolList: 
    - 
     name: jira 
     matchUrl: http://someJiraUrl 
    - 
     name: bamboo 
     matchUrl: http://someBambooUrl 

benim yarattığım:

@Component 
public class Tool{ 
    private String name; 
    private String matchUrl; 

    public Tool(){ 
     //empty ctor 
    } 

    public String getName(){ 
     return name; 
    } 

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

    public void setMatchUrl(String matchUrl){ 
     this.matchUrl= matchUrl; 
    } 

    @Override 
    public String toString(){ 
     StringBuffer sb = new StringBuffer(); 
     String ls = System.lineSeparator(); 
     sb.append(ls); 
     sb.append("name: " + name); 
     sb.append(ls); 
     sb.append("matchUrl: " + matchUrl); 
     sb.append(ls); 
    } 
} 

Ben kullandı: Bir Tool.class yarattı

@Component 
@ConfigurationProperties(prefix = "tools") 
public class Tools{ 
    private List<Tool> toolList = new ArrayList<>(); 
    public Tools(){ 
     //empty ctor 
    } 

    public List<Tool> getToolList(){ 
     return toolList; 
    } 

    public void setToolList(List<Tool> tools){ 
     this.toolList = tools; 
    } 
} 

aşağıdaki SR1

ilgili yaml alıntı @Outowired aracılığıyla bir başka sınıfta bu kombinasyon

@Component 
public class SomeOtherClass{ 

    private Logger logger = LoggerFactory.getLogger(SomeOtherClass.class); 

    @Autowired 
    private Tools tools; 

    /* excluded non-related code */ 

    @PostConstruct 
    private void init(){ 
     List<Tool> toolList = tools.getToolList(); 
     if(toolList.size() > 0){ 
      for(Tool t: toolList){ 
       logger.info(t.toString()); 
      } 
     }else{ 
      logger.info("*****-----  tool size is zero  -----*****"); 
     } 
    } 

    /* excluded non-related code */ 

} 

Ve günlüklerimde ad ve eşleşen URL'ler günlüğe kaydedildi. Bu başka bir makinede geliştirildi ve bu yüzden yukarıdakilerin tümünü yeniden yazmak zorunda kaldım, bu yüzden yanlışlıkla yanlış yazılmışsa lütfen beni affet.

Umarız bu birleştirme yorumu birçok kişiye yardımcı olur ve bu konuya katkıda bulunanlara çok teşekkür ederim!

+0

'' @ Component'' açıklaması gerekmez – heroin