Jakson を使用して、ネストされたポリモーフィック型を逆シリアル化しようとしています。つまり、私の最上位の型は、抽象的ではないクラスによって最終的に拡張される別のポリモーフィック型を参照しています。これは機能せず、例外がスローされます。
これは、私がやろうとしていることの縮小された例です。
package com.adfin;
import junit.framework.TestCase;
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.IOException;
public class JaksonDouble extends TestCase {
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "name"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = SecondLevel.class, name = "SECOND")
})
public static abstract class FirstLevel {
public abstract String getTestValue();
}
@JsonTypeInfo(
use = JsonTypeInfo.Id.CLASS,
include = JsonTypeInfo.As.PROPERTY,
property = "@class"
)
public static abstract class SecondLevel extends FirstLevel {
}
public static class FinalLevel extends SecondLevel {
String test;
@Override public String getTestValue() { return test; }
}
public void testDoubleAbstract() throws IOException {
String testStr = "{ \"name\": \"SECOND\", \"@class\": \"com.adfin.JasksonDouble.FinalLevel\", \"test\": \"foo\"}";
ObjectMapper mapper = new ObjectMapper();
FirstLevel result = mapper.readValue(testStr, FirstLevel.class);
}
}
抽象型に関する標準例外が発生します。
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.adfin.JaksonDouble$SecondLevel, problem: abstract types can only be instantiated with additional type information at [Source: java.io.StringReader@f2a55aa; line: 1, column: 19]
私のユースケースを説明しましょう。データのワークフローを記述した Json ドキュメントがあります。単一の値に対する操作を記述する「レベル 1」の抽象型があります。一般的な操作を実装する抽象的ではない一連のクラスを派生させます (それらすべてに @JsonSubTypes で注釈を付けます)。
「CUSTOM」と呼ばれる特別な @JsonSubTypes が 1 つあります。これは、他の誰かが (通常の jar の外部で) 記述したカスタム操作を表す別の抽象クラスであり、"@class" プロパティを使用して完全修飾クラス名を指定できます。Jakson パーサーは、2 番目のラベル クラスの @JsonTypeInfo アノテーションを読み取らないようです。
どうすればこれを機能させることができますか。または、少なくともこのユースケースを機能させるにはどうすればよいですか。