2015-09-15 5 views
28

私のSpringブートアプリケーションでは、以下の内容のapplication.yaml構成ファイルがあります。私はそれがチャネル構成のリストをConfigurationオブジェクトとして注入したい:SpringブートのオブジェクトのリストへのYamlのリストのマッピング

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

そして、私はPaymentConfigurationオブジェクトのリストが移入させたい@Configurationオブジェクト:

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

    } 

私はこれを注入しています@Autowiredコンストラクタを持つ通常のBean。 XYZの値が正しく設定されていますが、春には、オブジェクトのリストにYAML解析しようとするとき、私は

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] 

何がここで間違っている任意の手がかりを取得していますか?

+0

私はまったく同じ問題を抱えています:私は多くのことを試みましたが、空のオブジェクト、または同じエラー "型の値を変換できません...文字列.... MyObject ...一致するエディタまたは変換戦略が見つかりました。 奇妙なことに、私はSpring BootでSnakeYAMLのパラメータや動作に影響する可能性のあるものを変更していないのです...実際は、一体何ですか? – Alex

+0

私はほとんど忘れてしまった、私は春のブートを使用しています。1.2.6 – Alex

答えて

9

理由はどこか別の場所でなければなりません。設定なしでSpring Boot 1.2.2のみをそのまま使用すると、が正しく動作します。このレポを見てください - あなたはそれを壊すことができますか?

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

あなたはYAMLファイルは、あなたが貼り付けられた道を正確に見えますか?余分な空白、文字、特殊文字、誤ったインデントなどはありませんか?あなたが期待しているファイルの代わりに使用される検索パスの別の場所に別のファイルがある可能性はありますか?

+0

私は同じことをして、きれいなSpringBootプロジェクトで動作します。さまざまな環境でのプロパティローディングのカスタマイズが適切に動作していないことが判明しました。 –

11
  • あなたは@Configurationで使用するときは、いくつかの問題を持っている内部クラス
  • RefreshScope
  • に注釈を付ける必要はありませんコンストラクタ
  • を必要としません。 this github issue
は、このようなあなたのクラスを変更

ご覧ください。

@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

同じもの、一般的に私のコードは単純化されています 入れ子になった例外はjava.lang.IllegalStateExceptionです:[java.lang.String] 'channelConfigurations [0]':一致するエディタまたは変換戦略が見つかりませんでした。 –

+0

私はコードを実行し、割り当てられたすべての値を表示しました。 RefreshScopeアノテーションを削除しました –

+0

あなたのスプリングブートバージョンは何ですか? –

4

私はこれも多くの問題を抱えていました。私はついに最終的な取引を見つけました。

@Gokhan Onerの答えを参照すると、Serviceクラスとオブジェクトを表現するPOJOが得られたら、YAML設定ファイルはすばらしくて痩せます。アノテーション@ConfigurationPropertiesを使用する場合、明示的にオブジェクトを取得する必要がありますそれを使用することができます。 Like:

@ConfigurationProperties(prefix = "available-payment-channels-list") 
//@Configuration <- you don't specificly need this, instead you're doing something else 
public class AvailableChannelsConfiguration { 

    private String xyz; 
    //initialize arraylist 
    private List<ChannelConfiguration> channelConfigurations = new ArrayList<>(); 

    public AvailableChannelsConfiguration() { 
     for(ChannelConfiguration current : this.getChannelConfigurations()) { 
      System.out.println(current.getName()); //TADAAA 
     } 
    } 

    public List<ChannelConfiguration> getChannelConfigurations() { 
     return this.channelConfigurations; 
    } 

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

} 

次にここに移動します。それは地獄のように簡単ですが、オブジェクトgetterを呼び出さなければならないことを知る必要があります。私はオブジェクトが値で構築されてほしい初期化で待っていたが、いいえ。期待しています:)

3

私はこの記事や他の多くの資料を参照していましたが、明確な簡潔な回答が見つかりませんでした。

春ブーツバージョン:1.3.5.RELEASE

春Coreバージョン:4.2.6.RELEASE

私は、次の中で、このスレッドからいくつかの参照でに到着し、私の発見を提供しています

依存関係管理:Brixton。Tools.class

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

は、私が作成した:

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

私が使用した:私はTool.classを作成し

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

次SR1

は、適切なYAMLの抜粋です。 @Autowiredを通した別のクラスのこの組み合わせ

@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 */ 

} 

ログには、名前と一致するURLが記録されています。これは別のマシンで開発されたため、上記のすべてを再入力する必要があったので、間違ってミスタイプした場合、事前に私を許してください。

この統合コメントが多くの人に役立つことを願っています。このスレッドの以前の貢献者に感謝します。

+0

Toolクラスに '' @ Component''アノテーションは必要ありません – heroin

関連する問題