2017-09-18 9 views
0

私はコードの実際のエラーを見つけたので、私は質問を書き直しています。ジャクソンとサブクラス内のジェネリックタイプ

これは、(私はジャクソン2.9.0を使用しています)私の問題の完全な機能の例です:

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.ObjectReader; 
import java.io.IOException; 
import java.net.URL; 
import java.util.List; 

public class MainClass { 

    public static class SubClass<TYPE> { 
     private List<TYPE> values; 

     public List<TYPE> getValues() { 
      return values; 
     } 

     public void setValues(List<TYPE> values) { 
      this.values = values; 
     } 
    } 

    public static class Foo { 
     private String name; 
     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    private SubClass<Foo> propertyFoo; 

    public SubClass<Foo> getPropertyFoo() { 
     return propertyFoo; 
    } 

    public void setPropertyFoo(SubClass propertyFoo) { 
     this.propertyFoo = propertyFoo; 
    } 

    public static void main(String args[]) throws IOException { 
     URL url = System.class.getResource("/testFoo.json"); 
     ObjectMapper mapper = new ObjectMapper(); 
     ObjectReader reader = mapper.readerFor(MainClass.class); 
     MainClass mainClass = reader.readValue(url); 
     mainClass.getPropertyFoo().getValues().forEach(foo -> { 
      System.out.println(String.format("name: %s", foo.getName())); 
     }); 
    } 
} 

注意不足している型パラメータ:

public void setPropertyFoo(SubClass propertyFoo) 

代わりの

public void setPropertyFoo(SubClass<Foo> propertyFoo) 

最初の形式はコンパイルされますが、実行時に次の例外が発生します

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MainClass$Foo 
+0

これはお答えしますか? https://stackoverflow.com/a/41567297/460557? –

+0

あなたの行動を再現することはできません。 [mcve]を入力してください。 「読者」とは何ですか?どのように初期化しましたか? –

+0

ジャクソンのどのバージョンで作業していますか?最新のJackson 2は、このタイプとオブジェクト階層をうまく処理する必要があります。 –

答えて

0

私が新しく編集した投稿に書いたように、私の問題はそのセッターであった。コンパイルしても、Jacksonは内部オブジェクトに使用する正しい型を見つけることができなかったので、例外をスローしていました。

public void setPropertyFoo(SubClass<Foo> propertyFoo) 

public void setPropertyFoo(SubClass propertyFoo) 

を修正

私はそれは些細な誤りだ知っているが、私はすでに問題を見つけることにすべてのこの時間を費やしているので、多分それは、誰かを助けます。 mod/adminがこれが役に立たないと思ったら、私は全体を削除することができます。