[英]ObjectMapper's readValue method giving MismatchedInputException
我使用 objectMapper 首先序列化和反序列化 object。 我在这里序列化 object:
byte[] data = objectMapper.writeValueAsBytes(service.getServiceInfo());
client.create().withMode(CreateMode.EPHEMERAL).forPath(service.getLeaderPath(), data);
getServiceInfo
的类型为: ServiceInfo.class
以下是我尝试反序列化数据的方式:
byte[] data = client.getData().forPath(service.getLeaderPath());
T serviceInfo = objectMapper.readValue(data, typeServiceInfo);
这里T
是ServiceInfo.class
类型,而 typeServiceInfo 是它的 class 变量Class<T>
这是 ServiceInfo.class:
@Data
public class ServiceInfo {
private String name;
public ServiceInfo(String name) {
this.name = name;
}
}
现在当我运行我的代码时,我得到一个MismatchedInputException
这是我得到的错误跟踪:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.nutanix.categories.beans.curator.ServiceInfo` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"2816c308-5277-4b23-bdd6-64d6f3513e16"}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1429)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1059)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3266)
at com.nutanix.categories.curators.ServiceLeaderLatch.start(ServiceLeaderLatch.java:74)
我在这里做错了什么? 任何帮助都深表感谢。
PS:如果我必须在评论中提交有关我的查询的其他信息,请提及
有两种方法可以解决它:
修改 ServiceInfo bean 本身并删除构造函数。 虽然,它会要求您更新它的所有声明。
@Data public class ServiceInfo { private String name; }
或者,将@JsonCreator
注释添加到 bean
@Data public class ServiceInfo { private String name; @JsonCreator public ServiceInfo(@JsonProperty("name") String name) { this.name = name; } }
如果不喜欢@JsonProperty
注解,可以自定义ObjectMapper
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-paranamer</artifactId>
<version>${some-version}</version>
</dependency>
然后注册模块:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModules(new ParanamerModule());
另一种选择是保持一切原样并添加默认构造函数
@Data
public class ServiceInfo {
private String name;
public ServiceInfo() {
}
public ServiceInfo(String name) {
this.name = name;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.