Jackson Mixin 反序列化不允许空值

问题描述

我正在尝试反序列化一个我无法修改的简单 Java 类,使用如下所示的 mixin

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 中的字段之一为空时,反序列化失败并出现此错误

com.fasterxml.jackson.databind.exc.ValueInstantiationException:无法构造 com.azure.communication.callingserver.models.events.CallLegStateChangedEvent 的实例,问题:对象对话 ID 不能为 null 或为空 在 [来源: (String)"{"callLegId":"03000480-ca4d-494d-920e-f836b6a0db0d","callState":"Establishing"}";行:1,列:79] 在 com.fasterxml.jackson.databind.exc.ValueInstantiationException.from(ValueInstantiationException.java:47) 在 com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1907) 在 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) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializefromObjectUsingNonDefault(BeanDeserializerBase.java:1405) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializefromObject(BeanDeserializer.java:362) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195) 在 com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
在 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) 在 com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.deserialize(CallLegStateChangedEvent.java:143)
在 com.calling.App.main(App.java:20) 引起:java.lang.IllegalArgumentException:对象conversationId不能为空或为空 在 com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.(CallLegStateChangedEvent.java:112)
在 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 时允许反序列化空值或空值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)