【问题标题】:ObjectMapper's readValue method giving MismatchedInputExceptionObjectMapper 的 readValue 方法给出 MismatchedInputException
【发布时间】:2020-07-22 18:48:44
【问题描述】:

我使用 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);

这里TServiceInfo.class 类型,typeServiceInfo 是它的类变量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:请说明我是否必须在 cmets 中提交有关我的查询的其他信息

【问题讨论】:

    标签: java json spring jackson


    【解决方案1】:

    有两种方法可以解决:

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

       @Data
       public class ServiceInfo {
           private String name;
       }
      
    2. 或者,给bean添加@JsonCreator注解

       @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());
    

    【讨论】:

    • 我还发现添加一个调用 super() 的默认构造函数也可以。
    • 增加了一种方式
    【解决方案2】:

    另一种选择是保留所有内容并添加默认构造函数

        @Data
        public class ServiceInfo {
          private String name;
          
          public ServiceInfo() {
          }
    
          public ServiceInfo(String name) {
            this.name = name;
          }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多