Java REST Jackson JsonDeserialize,StackOverflower升级后出错

Java REST Jackson JsonDeserialize,StackOverflower升级后出错,java,json,rest,jackson,deserialization,Java,Json,Rest,Jackson,Deserialization,在以前版本的jackson(1.9.2)中,以下代码运行良好: import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.DeserializationContext; ... @JsonDeserialize(using = RoleDeserializer.class) public interface Ro

在以前版本的jackson(1.9.2)中,以下代码运行良好:

import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.DeserializationContext;
...
@JsonDeserialize(using = RoleDeserializer.class)
public interface RoleDto {}

public class RoleDeserializer extends SomeSharedDeserializer<RoleDto> {}

public class SomeSharedDeserializer<T> extends JsonDeserializer<T> {
    @Override
    public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
    {
        return jp.readValueAs(getImplementation());
    }

    public Class<? extends T> getImplementation(){ ... returns some generated implementation of RoleDto }
}
反序列化器现在可见(前一个异常已消失), 然而,我们得到了StackOverflowerr异常。com.fasterxml.jackson.databind.ObjectMapper读取值(第3023行):

但是我们的类是生成的。作为我尝试使用的另一种解决方案

ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jp, getImplementation());
但是得到了相同的结果-StackOverflow异常

我们怎样才能修复它?我们是否可以使用一些反序列化程序来传递JsonParser实例,该实例生成的类实现了基本接口,并且没有StackOverflowerError?

是您可以找到完整的描述和尝试来找到解决方案。 已找到以下解决方案:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig;
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
import com.fasterxml.jackson.databind.type.SimpleType;
...
    public abstract class RestDtoDeserializer<T> extends JsonDeserializer<T>
    {
        @Override
        public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
        {
            DeserializationConfig config = ctxt.getConfig();
            SimpleType simpleType = SimpleType.construct(getImplementationClass());
            BeanDescription beanDesc = config.introspect(simpleType);
            BeanDeserializerFactory instance = new BeanDeserializerFactory(new DeserializerFactoryConfig());
            JsonDeserializer deserializer = instance.buildBeanDeserializer(ctxt, simpleType, beanDesc);
            ((ResolvableDeserializer)deserializer).resolve(ctxt);
            return (T) deserializer.deserialize(jp, ctxt);
        }

        public abstract Class<? extends T> getImplementationClass();
import com.fasterxml.jackson.core.JsonParser;
导入com.fasterxml.jackson.databind.BeanDescription;
导入com.fasterxml.jackson.databind.DeserializationConfig;
导入com.fasterxml.jackson.databind.DeserializationContext;
导入com.fasterxml.jackson.databind.JsonDeserializer;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.annotation.JsonDeserialize;
导入com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig;
导入com.fasterxml.jackson.databind.desr.beandSerializerFactory;
导入com.fasterxml.jackson.databind.desr.ResolvableDeserializer;
导入com.fasterxml.jackson.databind.type.SimpleType;
...
公共抽象类restdodeserializer扩展了JsonDeserializer
{
@凌驾
公共T反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException
{
反序列化配置=ctxt.getConfig();
SimpleType SimpleType=SimpleType.construct(getImplementationClass());
BeanDescription beanDesc=config.introspect(simpleType);
BeanDeserializerFactory实例=新的BeanDeserializerFactory(新的DeserializerFactoryConfig());
JsonDeserializer反序列化器=instance.buildBeanDeserializer(ctxt、simpleType、beanDesc);
((ResolvableDeserializer)反序列化器).resolve(ctxt);
返回(T)反序列化器。反序列化(jp,ctxt);
}
公共抽象类
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
//here manually create new object and return it
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jp, getImplementation());
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig;
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
import com.fasterxml.jackson.databind.type.SimpleType;
...
    public abstract class RestDtoDeserializer<T> extends JsonDeserializer<T>
    {
        @Override
        public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
        {
            DeserializationConfig config = ctxt.getConfig();
            SimpleType simpleType = SimpleType.construct(getImplementationClass());
            BeanDescription beanDesc = config.introspect(simpleType);
            BeanDeserializerFactory instance = new BeanDeserializerFactory(new DeserializerFactoryConfig());
            JsonDeserializer deserializer = instance.buildBeanDeserializer(ctxt, simpleType, beanDesc);
            ((ResolvableDeserializer)deserializer).resolve(ctxt);
            return (T) deserializer.deserialize(jp, ctxt);
        }

        public abstract Class<? extends T> getImplementationClass();