2012-10-20 6 views
0

Restlet을 사용하여 객체의 JSON 배열을 반환하는 API를 호출하고 있습니다. 단일 객체를 되돌리려면 비슷한 호출을 할 때 모든 것이 사용자 정의 클래스에 올바르게 매핑되지만, 배열을 되돌릴 때 Object는이 사용자 정의 객체 대신 LinkedHashMap으로 매핑됩니다. 배열을 올바르게 deserialize하는 방법을 정의 할 필요가있을 것이라고 확신하지만, 정확히 어떻게해야하는지 알지 못했습니다.Restlet/Jackson을 사용하여 객체의 JSON 배열 비 직렬화

@Get("json") 
public Trait getTrait(); 

@Get("json") 
public HashSet<Trait> getTraits(); 

전자는 정상적으로 작동하지만 후자는 작동하지 않습니다. 궁극적으로 HashSet을 반복 할 때이 오류가 발생할 수 있습니다. java.util.LinkedHashMap을 com.test.traits.Trait로 캐스팅 할 수 없습니다.

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

답변

2

일반적으로 유형이 일반 유형 (HashSet<Trait>) 대신 클래스 (예 : HashSet)로 전달 되었기 때문입니다. 그렇다면 HashSet<Object>에 해당하며 Jackson은 콘텐츠를 가장 간단한 Object 유형에 바인딩 할 수밖에 없습니다. 일치하는 항목은 java.util.Collection 일종입니다.

Restlet이 어떤 이유로 일반 유형 정보를 올바르게 전달하지 않는 것 같습니다.

이 할 일이 차선책이 있습니다 List들과 Map의 항상 자바 객체, 결코 루트 레벨 값의 속성이되도록

  • 는 래퍼 객체를 사용합니다. 이렇게하면 Restlet이 루트 값
  • 하위 클래스 HashSet에 대한 제네릭 유형을 전달하지 않아서 일반 유형이 아닌 경우에도 해당 유형이 작동합니다. 잭슨은 다음 두 번째 경우를 들어 HashSet

에 대한 일반적인 유형을 알아낼 수, 당신은 무언가 같이 수행

public class MyTraits extends HashSet<Trait> { } 

@Get("json") 
public MyTraits getTraits(); 

그리고 MyTraits 더 제네릭 형식이 없기 때문에 그것은 작동합니다 그 자체의; 슈퍼 타입 선언에는 Jackson이 사용할 수있는 일반 매개 변수가 있습니다.

+0

후자가 작동했습니다. 나는 실제로 그것을 시도했지만, 나의 새로운 콜렉션에는 generics가있다. 나가 그것을 가지고 갈하자마자 모두는 일했다. – Nick

관련 문제