当前位置: 首页 > 知识库问答 >
问题:

使用新记录类时无法反序列化

党浩阔
2023-03-14

我想看看是否可以用Java14中的新记录类替换现有的POJO。但不能这样做。获取以下错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造com.a.a.post的实例(不存在创建器,如默认构造):无法从对象值反序列化(没有基于委托或属性的创建器)

我将在Spring Boot版本2.2.6中使用Java14完成此操作。

下面使用通常的POJO工作。

职后

public class PostClass {
    private int userId;
    private int id;
    private String title;
    private String body;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}
public PostClass[] getPosts() throws URISyntaxException {
    String url = "https://jsonplaceholder.typicode.com/posts";
    return template.getForEntity(new URI(url), PostClass[].class).getBody();
}
public record Post(int userId, int id, String title, String body) {
}
public Post[] getPosts() throws URISyntaxException {
    String url = "https://jsonplaceholder.typicode.com/posts";
    return template.getForEntity(new URI(url), Post[].class).getBody();
}

尝试将构造函数添加到记录Post中,但出现相同错误:

public record Post(int userId, int id, String title, String body) {
    public Post {
    }
}

public record Post(int userId, int id, String title, String body) {
    public Post(int userId, int id, String title, String body) {
        this.userId = userId;
        this.id = id;
        this.title = title;
        this.body = body;
    }
}

共有1个答案

史飞尘
2023-03-14

编译器为记录生成构造函数和其他访问器方法。

就你的情况而言,

  public final class Post extends java.lang.Record {  
  public Post(int, int java.lang.String, java.lang.String);
  public java.lang.String toString();
  public final int hashCode();
  public final boolean equals(java.lang.Object);
  public int userId();
  public int id();
  public java.lang.String title();
  public java.lang.String body();
}

在这里,您可以看到没有缺省的构造函数,它需要得到Jackson。您使用的构造函数是一个紧凑的构造函数,

public Post {
 }
public record Post(int userId, int id, String title, String body) {
    public Post() {
        this(0,0, null, null);
    }
}

编辑为PSA:Jackson可以正确地序列化和反序列化2.12的记录,它已经发布了。

 类似资料:
  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 我的Json看起来类似于(并且它是不可修改的) 我知道这个问题已经被问了很多次了,甚至我也得到了一些帮助,例如:无法反序列化START_OBJECT令牌之外的java.util.ArrayList实例 但我还是无法克服这个错误

  • 我试图将Kafka中的Avro消息反序列化为从Avro模式生成的POJO。我正在使用Kafkaavroderializer进行此转换。 我可以在

  • 代码试图采用java.awt.color类使用jackson对象映射器对其进行序列化。获取生成的json字符串并将其反序列化回java.awt.color类。但是在进行反序列化时会出现以下错误。 线程"main"com.fasterxml.jackson.databind.JsonMappingException中的异常:找不到适合类型[简单类型,类java.awt.颜色]的构造函数:无法从JSO

  • 我正在尝试将我的代码 Json 数组中的这个 元素反序列化为自定义类..但我不能: 这是类: 但是我收到此错误: com.fasterxml.jackson.databind.exc.MismatchedInputException: START_ARRAY无法从 [Source: UNKNOWN; line: -1, column: -1] at com.fasterxml.jackson.da