【问题标题】:Serialise Nested Class to Table Rows in Spring在 Spring 中将嵌套类序列化为表行
【发布时间】:2019-12-02 13:42:59
【问题描述】:

我正在使用带有预期依赖项(Jackson、Hibernate 等)的 Spring Boot。

我有一张名为 Buildings 的表格,其中 Unit、Number、Street 等都是列。但我更喜欢解析它并将其作为我创建的名为“StreetAddress”的类返回。

当我发送这个 JSON 时,我收到一个错误。

"address": {
    "unit":"0101",
    "number":"19",
    "suffix":"STREET",
    "suburb":"Example",
    "state":"EXP",
    "streetName":"Example",
    "postCode":"400"
}

这是错误:

Cannot construct instance of `com.App.Entity.Helpers.StreetAddress` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

我在我的 Building 模型中将此作为 setAddress。有没有我可以用来告诉杰克逊如何正确解析它的注释?

private String subunit;
private Integer number;
private String streetname;
private String suffix;
private String suburb;
private String state;
private Integer postcode;    

public void setAddress(StreetAddress address) {
        this.subunit = address.getUnit();
        this.number = address.getNumber();
        this.streetname = address.getStreetName();
        this.suffix = address.getSuffix().toString();
        this.suburb = address.getSuburb();
        this.state = address.getState().toString();
        this.postcode = address.getPostCode();
    }

澄清:

public class StreetAddress {
private String unit;
private Integer number;
private String streetname;
private StreetSuffix suffix;
private String suburb;
private AUState state;
private Integer postcode;

public StreetAddress(String unit, int number, String street, StreetSuffix suffix, String suburb, AUState state, int postcode) {
    this.unit = unit;
    this.number = number;
    this.streetname = street;
    this.suffix = suffix;
    this.suburb = suburb;
    this.state = state;
    this.postcode = postcode;
}

public String getUnit() {
    return unit;
}

public Integer getNumber() {
    return number;
}

public String getStreetName() {
    return streetname;
}

public String getSuffix() {
    return suffix.toString();
}

public String getSuburb() {
    return suburb;
}

public AUState getState() {
    return state;
}

public Integer getPostCode() {
    return postcode;
}

}

【问题讨论】:

  • StreetAddress 是如何定义的?
  • 不是,否则我相信Spring会在相关表中寻找StreetAddress对象。
  • “定义”是指您编写的类声明。你说你已经创建了这个类,毕竟?很可能那里缺少一些东西。
  • public class StreetAddress { private String unit; private Integer number; private String streetname; private StreetSuffix suffix; private String suburb; private AUState state; private Integer postcode; public StreetAddress(String unit, int number, String street, StreetSuffix suffix, String suburb, AUState state, int postcode) { this.unit = unit; this.number = number; this.streetname = street; this.suffix = suffix; this.suburb = suburb; this.state = state; this.postcode = postcode; }

标签: java json spring-boot jackson


【解决方案1】:

错误消息说 Jackson 不知道如何创建 StreetAddress 类型的对象,因为它找不到合适的构造函数。 Jackson 要么期望一个无参数构造函数(在这种情况下,它将通过分配字段或调用 setter 来传递 JSON 数据),或者期望一个带有注释的构造函数,告诉 Jackson 应该将哪个 JSON 属性传递给哪个参数。

解决此问题的最简单方法是不声明构造函数,而是将字段公开:

public class StreetAddress {
    public String unit;
    // ... more fields here
}

或者,您可以将字段保持私有,但为每个字段声明一个 setter:

public class StreetAddress {
    private String unit;
    // ... more fields here

    public void setUnit(String unit) {
        this.unit = unit;
    }
    // ... more setters here
}

【讨论】:

  • 似乎对我不起作用。我添加了 setter,但我将构造函数留在了那里(当我使用它时) - 我需要删除构造函数吗?
  • 正如我所说:您必须提供无参数构造函数,或者注释现有构造函数,以便杰克逊知道哪个 JSON 属性进入哪个参数。因此,您可以提供一个额外的无参数构造函数以使其使用设置器(或公共字段),或者annotate your constructor so Jackson knows which JSON-attribute goes into which parameter
  • 啊,我明白了——你是对的,这已经解决了。非常感谢!
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多