我使用objectMapper首先序列化和取消序列化对象。我在这里序列化对象:
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
,类型ServiceInfo是它的类变量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;
}
}