2012-08-07 3 views
0

현재 제네릭을 사용하는 모델에서 작업 중이며 조금 복잡합니다. 나는 비슷한 질문에 답을 얻었지만 그들 중 누구도 분명히 내 대답에 도달하지 못한다는 것을 이해합니다. 내가 직렬화하는 동안 다음 java.lang.StackOverflowError의를 얻을 수Jackson을 사용하여 Java generics 직렬화 및 비 직렬화 : StackOverflowError

public static void main(String[] args) throws Exception 
    { 

     Cls2<ChildContainer> req = new Cls2<ChildContainer>(); 

     File file = new File("==some-file-path=="); 

     ObjectMapper mapper = new ObjectMapper(); 

     mapper.writeValue(file, req); 

     //read it back using mapper.readValue(file, clazz) --Not sure about this 
    } 

을 :

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type") 
@JsonSubTypes(
       { 
        @Type(value = Cls2.class, name = "Cls2") 
       }) 
abstract class Cls1<T> implements Serializable 
{ 
    private T myObj; 

    public T getMyObj() 
    { 
     return myObj; 
    } 

    public Cls1(T obj) 
    { 
     myObj = obj; 
    } 
    @JsonTypeName("Cls2") 
    public static class Cls2<E extends Int1> extends Cls1<E> implements Serializable 
    { 
     public Cls2() 
     { 
      super(null); 
     } 
    } 
} 

@JsonTypeName("ChildContainer") 
class ChildContainer extends ParentContainer<OtherBean> 
{ 

} 

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type") 
@JsonSubTypes(
       { 
        @Type(value = ChildContainer.class, name = "ChildContainer") 
       }) 
class ParentContainer<T extends RootBean> implements Int1 
{ 

} 

@JsonTypeName("OtherBean") 
class OtherBean extends RootBean 
{ 

} 

@JsonTypeName("RootBean") 
class RootBean implements Int1 
{ 

} 

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type") 
@JsonSubTypes(
       { 
        @Type(value = RootBean.class, name = "RootBean"), 
        @Type(value = OtherBean.class, name = "OtherBean") 
       }) 
interface Int1 extends Serializable 
{ 

} 

내 목표는 직렬화 다음과 같이 잭슨을 사용 deserialze하는 것입니다

여기

내 모델입니다
Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.Class.getDeclaringClass(Native Method) 
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290) 
    at org.codehaus.jackson.map.type.TypeBindings._resolve(TypeBindings.java:221) 
    at org.codehaus.jackson.map.type.TypeBindings.findType(TypeBindings.java:138) 
    at org.codehaus.jackson.map.type.TypeFactory._fromVariable(TypeFactory.java:951) 
    at org.codehaus.jackson.map.type.TypeFactory._constructType(TypeFactory.java:493) 
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:423) 
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:395) 
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:299) 
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290) 
    at org.codehaus.jackson.map.type.TypeBindings._resolve(TypeBindings.java:221) 
    at org.codehaus.jackson.map.type.TypeBindings.findType(TypeBindings.java:138) 
    at org.codehaus.jackson.map.type.TypeFactory._fromVariable(TypeFactory.java:951) 
    at org.codehaus.jackson.map.type.TypeFactory._constructType(TypeFactory.java:493) 
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:423) 
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:395) 
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:299) 
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290) 

도움을 주시면 감사하겠습니다.

+0

스택의 (반복 된) 부분을 오류 메시지에서 또는 디버거에서 캡처 한대로 게시하면 원형이 어디에서 발생하는지 확인할 수 있습니다. –

+0

@AndrzejDoyle stacktrace를 사용하여 게시물을 업데이트했습니다. – Chris

+1

Jackson에서 버그 인 것으로 보이는 유형 확인에 무한 재귀가 있습니다. 'Cls2'를 독립 실행 형 클래스로 추출해보십시오. – BalusC

답변

1

stacktrace는 Cls2의 유형 분석에서 무한 재귀를 제안합니다. 이는 자체적으로 중첩 된 클래스를 확장합니다. 이것은 잭슨 (report it!)의 코너 케이스 버그 인 것 같습니다. 한편, Cls2을 수퍼 클래스에 중첩하는 대신 독립 실행 형 클래스로 추출하면이 문제가 해결됩니다.

관련 문제