繁体   English   中英

ObjectMapper 的 readValue 方法给出 MismatchedInputException

[英]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);

这里TServiceInfo.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:如果我必须在评论中提交有关我的查询的其他信息,请提及

有两种方法可以解决它:

  1. 修改 ServiceInfo bean 本身并删除构造函数。 虽然,它会要求您更新它的所有声明。

     @Data public class ServiceInfo { private String name; }
  2. 或者,将@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM