2017-09-18 1 views
0

코드의 실제 오류를 알아 냈으므로 다시 작성하고 있습니다.Jackson 및 하위 클래스의 제네릭 유형

이 (나는 잭슨 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과 함께하고 있습니까? 최신 Jackson 2는이 유형과 객체 계층 구조를 잘 처리해야합니다. –

답변

0

내가 새로 편집 한 게시물에 썼 듯이, 제 문제는 그 세터와 함께있었습니다. 그것은 컴파일하지만 Jackson은 내부 객체에 사용할 올바른 유형을 찾을 수 없으므로 예외가 발생했습니다.

public void setPropertyFoo(SubClass propertyFoo) 

고정

public void setPropertyFoo(SubClass<Foo> propertyFoo) 

에 나는 사소한 오류입니다하지만 난 이미 문제를 찾는 데 모든 시간을 소비하기 때문에, 어쩌면 누군가 도움이 될 것입니다 알고있다. mod/admin이 이것이 도움이되지 않는다고 생각하면, 나는 전체를 삭제할 수 있습니다.