问题描述
我正在尝试反序列化一个我无法修改的简单 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 (将#修改为@)