2017-03-02 13 views
1

以下のYAMLを以下のドメインモデルにdeseriliseするためにsnakeyamlを使用しようとしていますが、java.lang.ClassCastExceptionを取得し続けます。java.util.LinkedHashMapはConfigurableThingにキャストできません。SnakeYamlオブジェクトのリストを含むDeserialiseクラス

注ConfigurableThingをデシリアライズすると、ConfigurableThingsのリストをデシリアライズして問題が発生した場合にのみ、正常にデシリアライズできます。

コードYAML

File file = new File(classLoader.getResource("config.yml").getFile()); 

     try(InputStream in = new FileInputStream(file)){ 
      Yaml yaml = new Yaml(); 
      Configuration config = yaml.loadAs(in,Configuration.class); 
     } 

をdeserialiseする

things: 
- type: TYPE1 
    name: foo 
    value: 2.00 
- type: TYPE2 
    name: bar 
    value 8.00 

モデル

public final class Config { 

    private List<ConfigurableThing> things; 

    //Getter and Setter 

} 

public final class ConfigurableThing { 

    private Type type; 

    private String name; 

    private BigDecimal value; 

    //Getters and Setters 
} 

public enum Type { 
    TYPE1,TYPE2 
} 

答えて

2

あなたは、コードのヨーヨーを表示しませんあなたのYAMLを読み込むために使用しますが、コレクションタイプを適切に登録していない可能性があります。これを試してみてください:

Constructor constructor = new Constructor(Config.class); 
TypeDescription configDesc = new TypeDescription(Config.class); 
configDesc.putListPropertyType("things", ConfigurableThing.class); 
constructor.addTypeDescription(configDesc); 
Yaml yaml = new Yaml(constructor); 
Config config = (Config) yaml.load(/* ... */); 

あなたがこれを行うために必要な理由は、型消去である - SnakeYamlは、実行時にListインターフェースの一般的なパラメータを決定することはできません。したがって、リスト項目を作成するにはConfigurableThingと言う必要があります。そうでない場合は、HashMapが作成されます。これはエラーメッセージに表示されます。

+0

完璧、ありがとう!後世のために、YAMLをロードしている間違ったコードを追加しました。 –

+0

あなたの編集提案は、人々がそれを拒否したにもかかわらず正しかったです。 'addTypeDescription'は正しい名前です。 SnakeYamlのドキュメンテーションはちょうど間違っている 'addTypeDefinition'を使います。 – flyx

+0

これはうまくいくが、いくつかの行を追加するだけで、最後の行で何が起きているのかが少し分かる。File file = new File( "configuration.yaml"); InputStream in =新しいFileInputStream(ファイル); 構成リスト=(構成)yaml.load(入力); –

関連する問題