2015-01-14 2 views
1

커다란 클래스 세트 (100 개가 넘는 클래스)가 있으며, 모두 추상적 클래스에서 확장되었습니다. ParentClass이라고합시다. 자식 클래스 ChildA, ChildB 등을 호출하겠습니다. 모든 자식에 대해 사용자 정의 직 병렬 변환기를 등록하고 클래스 해제 형식으로 클래스를 가져 오려면 어떻게해야합니까?클래스를 추상화하는 Jackson 커스텀 데시리아 화 모듈

module.addDeserializer(ParentClass.class, new MyObjectDeserializer());

을했지만 작동하지 않습니다 나는 시도했다.

나는 (작동하고 어떤) 일을 건너 뛰려면 :

module.addDeserializer(ChildA.class, new MyObjectDeserializer(ChildA.class)); 
module.addDeserializer(ChildB.class, new MyObjectDeserializer(ChildB.class)); 
module.addDeserializer(ChildC.class, new MyObjectDeserializer(ChildC.class)); 
//etc...... 

클래스 유형이이 클래스 이름을 정의 된 것을, 나는 스프링 @RequestBody 방법에 대해 잭슨을 사용할 생각으로 알려진되어야한다. 어떻게 할 수 있습니까?

+0

동일한 상위 디시리얼라이저를 사용하는 경우 해당 하위 클래스를 모두 등록해야합니까? 어쩌면 컨트롤러 함수를 정의하여 Parent 클래스를 받고 다른 방법으로 자식 클래스를 구분해야합니다. – hofan41

+0

좋은 해결책은 아닙니다. 직접 클래스를 다루는 것이 훨씬 쉽습니다. 오히려 직접 클래스를 추상 클래스와 구별 할 수있는 메커니즘을 만드는 것입니다. (게다가, 우리는 구체적인 클래스에서 많은 코드를 가지고 있습니다). – Tom

+0

나는 이것을 잭슨의 버그라고 생각한다. 나는 문제를 제기했다 : https://github.com/FasterXML/jackson-databind/issues/1784 –

답변

1

내가 아는 한, 잭슨에는 당신의 정확한 요구를 해결할 메커니즘이 없다고 생각합니다.

그러나 몇 가지 대안을 시도해 볼 수 있습니다. Deserializing polymorphic types with Jackson은 이러한 대안 중 하나를 설명하지만 지원되는 모든 하위 유형을 명시 적으로 정의해야합니다.

역 직렬화 관계를 명시 적으로 정의 할 필요가없는 또 다른 대안은 클래스 계층을 상속 중 하나에서 컨테이너로 변경하는 것입니다.

public class DataContainer<T> { 
    String commonString; 
    Integer commonInteger; 

    T subData; 
} 

것은 단순히를 모두 정의 할 필요없이

public String controllerFunction(DataContainer<ClassA> classA); 

으로 컨트롤러 입력 기능에서 정의 할 수 있도록 다음과 같습니다과 같이 컨테이너에 추상 상위 클래스로 변환 예를 들어

, 이러한 서브 클래스의 직렬화 복원