首页 > 解决方案 > Jackson Mixin 反序列化不允许空值

问题描述

我正在尝试使用看起来像这样的 mixin 反序列化一个我无法修改的简单 Java 类

public abstract class CallLegStateChangedEventMixIn {


     @JsonCreator
    
     public CallLegStateChangedEventMixIn(

     @JsonProperty String conversationId,
     @JsonProperty String callLegId,

     @JsonProperty CallState callState) {
    }

}

然后像这样反序列化代码

ObjectMapper mapper = new ObjectMapper();

mapper.addMixIn(CallLegStateChangedEvent.class, CallLegStateChangedEventMixIn.class);
CallLegStateChangedEvent callLegStateChangedEvent = mapper.readValue(eventDataJsonString, CallLegStateChangedEvent.class);

当我有一个包含所有值的 JSON 时,此代码可以正常工作。但是当 JSON 中有一个字段为 null 时,反序列化会失败并出现此错误,

com.fasterxml.jackson.databind.exc.ValueInstantiationException:无法构造实例com.azure.communication.callingserver.models.events.CallLegStateChangedEvent,问题:在 [Source: (String)"{"callLegId":"03000480-ca4d-494d-920e-f836b6a0db0d" ,"callState":"正在建立"}"; line: 1, column: 79] at com.fasterxml.jackson.databind.exc.ValueInstantiationException.from(ValueInstantiationException.java:47) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1907) at com .fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapAsJsonMappingException(StdValueInstantiator.java:587)
在 com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.rewrapCtorProblem(StdValueInstantiator.java:610) 在 com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:293) 在 com.fasterxml .jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:288) 在 com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:202) 在 com.fasterxml.jackson.databind.deser .BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:520) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1405) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java :362) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer。com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) 的反序列化(BeanDeserializer.java:195)
在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue (ObjectMapper.java:3516) at com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.deserialize(CallLegStateChangedEvent.java:143)
at com.calling.App.main(App.java:20) 原因:java。 lang.IllegalArgumentException:com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.(CallLegStateChangedEvent.java:112) 中的对象 conversationId 不能为空或为空
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) 在 java.base/jdk.internal.reflect。 DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) 在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java: 480)在com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call(AnnotatedConstructor.java:124)在com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:291)... 12更多的

问题是,在使用 Jackson MixIns 时,如何允许对空值或空值进行反序列化?

标签: jsonjacksonjson-deserializationjackson-databindjackson-modules

解决方案


推荐阅读