1

对于同一模型类的第二次序列化的所有实例,对象仅具有它们应该具有的一部分属性及其各自的值。这样,JSON 文件结构就不像应用程序的旧部分(前端)所期望的那样同质化和统一。

[
{
    "id": 1,
    "fornecedor": {
        "cnpj": "80000876000177",
        "nome": "ATACADÃO DIA-A-DIA"
    },
    "itens": [
        {
            "id": 2,
            "produto": {
                "gtin": "7891991010856",
                "nome": "CERVEJA BUDWEISER"
            },
            "quantidade": 3,
            "preco": 3.5,
            "total": 10.5
        }
    ]
},
{
    "id": 3,
    "fornecedor": {
        "cnpj": "19600347000101",
        "nome": "SUPERMERCADO BELLA-VIA"
    },
    "itens": [
        {
            "id": 4,
            "produto": {
                "gtin": "7891991010857",
                "nome": "CERVEJA HEINEKEN"
            },
            "quantidade": 4,
            "preco": 5.4,
            "total": 21.6
        }
    ]
},
{
    "id": 5,
    "fornecedor": "19600347000101",
    "itens": [
        {
            "id": 6,
            "produto": "7891991010856",
            "quantidade": 4,
            "preco": 3.2,
            "total": 12.8
        }
    ]
},
{
    "id": 7,
    "fornecedor": "80000876000177",
    "itens": [
        {
            "id": 8,
            "produto": "7891991010857",
            "quantidade": 5,
            "preco": 4.9,
            "total": 24.5
        }
    ]
}
]

在上面的 JSON 中,id:1 和 id:7 的实例有一个名为fornecedor结构不同的字段,这不应该是因为前端期望它们相同。其他示例是带有字段的 id:2 和 id:6produto等等。

上面的 JSON 是下面模型类列表的序列化Pedido

@Data
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
public class Pedido {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(View.External.class)
private Long id;

@ManyToOne
@JoinColumn(name = "fornecedor_cnpj")
@JsonView(View.External.class)
private Fornecedor fornecedor;

@OneToMany(mappedBy = "pedido", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.External.class)
private List<Item> itens;

public List<Item> getItens() {
    if(itens == null){
        itens = new ArrayList<>();
    }
    return itens;
}
}

模型类Fornecedor是:

@Data
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "cnpj")
public class Fornecedor {

@Id
@JsonView(View.External.class)
private String cnpj;

@JsonView(View.External.class)
private String nome;

@OneToMany(mappedBy = "fornecedor", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Pedido> pedidos;

@OneToMany(mappedBy = "fornecedor", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Disponibilidade> disponilidades;
}

模型类Produto是:

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "gtin")
@NoArgsConstructor
@Data
public class Produto {

@Id
@JsonView(View.External.class)
private String gtin;

@JsonView(View.External.class)
private String nome;

@OneToMany(mappedBy = "produto", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Disponibilidade> disponibilidades;

public Produto(String gtin) {
    this.gtin = gtin;
}
}

问题:JSON 的结构是预期行为的表示?如果是这样,有人可以告诉我如何使第一个实例中的所有实例始终具有具有各自值的所有属性(这意味着重复的属性和值!)。

谢谢!

4

1 回答 1

1

您获得的 JSON 是@JsonIdentityInfo您或其他人在将 Java 对象序列化为 JSON 时添加的用于解决无限递归的结果(您可以在https://www.baeldung.com/阅读更多相关信息杰克逊双向关系和无限递归)。这意味着拥有完整属性集的唯一方法fornecedorproduto摆脱@JsonIdentityInfo这些类。请记住,这可能会产生上述无限递归问题。

@Data
@Entity
public class Fornecedor {
    (...)
}
@Entity
@NoArgsConstructor
@Data
public class Produto {
    (...)
}
于 2021-12-11T12:13:27.623 回答