Java REST Jackson JsonDeserialize,StackOverflower升级后出错
在以前版本的jackson(1.9.2)中,以下代码运行良好: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
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();