ObjectMapper's readValue 方法给出 MismatchedInputException



我使用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:请注意,如果我必须在评论中提交有关我的查询的其他信息

有两种方法可以解决它:

  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;
      }
    }

相关内容

  • 没有找到相关文章