0

HashMaps のツリーを次のように定義しました。

public class HashTree<K, V> extends HashMap<K, HashTree<K, V>> {

    private static final long serialVersionUID = 1L;
    boolean isLeaf = true;
    private HashMap<K, V> value = new HashMap<K, V>();

    public HashMap<K, V> getValues() {
        return value;
    }

    public void setValues(HashMap<K, V> value) {
        this.value = value;
    }

    public void putValue(K key, V value) {
        this.value.put(key, value);
    }

    public void removeValue(K key) {
        this.value.remove(key);
    }

    public void clearValues() {
        this.value.clear();
    }

}

タイプが再帰的であることに注意してください: HashMap<K, HashTree<K, V>>. Java では問題なく動作しますが、Jackson でシリアル化するとスタック オーバーフローが発生します。

java.lang.StackOverflowError
    com.fasterxml.jackson.databind.type.TypeBindings._resolveBindings(TypeBindings.java:232)
    com.fasterxml.jackson.databind.type.TypeBindings._resolveBindings(TypeBindings.java:269)
    com.fasterxml.jackson.databind.type.TypeBindings._resolveBindings(TypeBindings.java:309)
    com.fasterxml.jackson.databind.type.TypeBindings._resolveBindings(TypeBindings.java:309)
    com.fasterxml.jackson.databind.type.TypeBindings._resolveBindings(TypeBindings.java:309)
    com.fasterxml.jackson.databind.type.TypeBindings._resolve(TypeBindings.java:203)
    com.fasterxml.jackson.databind.type.TypeBindings.findType(TypeBindings.java:121)
    com.fasterxml.jackson.databind.type.TypeFactory._fromVariable(TypeFactory.java:798)
    com.fasterxml.jackson.databind.type.TypeFactory._constructType(TypeFactory.java:343)
    com.fasterxml.jackson.databind.type.TypeFactory.findTypeParameters(TypeFactory.java:279)
    com.fasterxml.jackson.databind.type.TypeFactory.findTypeParameters(TypeFactory.java:251)
    com.fasterxml.jackson.databind.type.TypeFactory._fromParamType(TypeFactory.java:759)
    com.fasterxml.jackson.databind.type.TypeFactory._constructType(TypeFactory.java:337)

...

これでシリアル化をインターセプトしようとしましたが、HashTree に遭遇したときに文字列 "123" を返すだけです。

public class HashTreeSerializer<K,V> extends StdSerializer<HashTree<K,V>> {

    public HashTreeSerializer() {
        super(HashTree.class, false);
    }

    @Override
    public void serialize(HashTree<K, V> tree, JsonGenerator json,
            SerializerProvider provider) throws IOException,
            JsonGenerationException {
        json.writeString("123");
    }

}

これらのジェネリック型を削除するために HashTree を StringHashTree に拡張しましたが、それでもスタック オーバーフローが発生します。何か案は?

4

1 に答える 1

2

これはバグです。タイプリゾルバは、これを許容可能な変数のないタイプに解決できる必要があります。

于 2012-09-18T16:22:44.177 に答える