Como resolver o problema de referência circular ao Serializar e Desserializar JSON de classes POJO’s quando estas são referente à 2 tabelas com relacionamento bidirecional (OneToMany e Many To One) e ainda possui chave primária composta, segue abaixo minhas classes:
Obs.: No JPA esta tudo correto, gravando e consultando, o problema é só no JSON.
@Embeddable
public class RoteiroPK implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "produto_id")
private Produto produto;
@Column(name = "codigo")
private String codigo;
}
@Entity
@Table(name = "tb_roteiro")
public class Roteiro implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private RoteiroPK roteiroPK;
@Column(name = "descricao", nullable = true, length = 30)
private String descricao;
@OneToMany(cascade = CascadeType.ALL, targetEntity = Operacao.class, fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "roteiro_produto_codigo", referencedColumnName = "produto_codigo"),
@JoinColumn(name = "roteiro_codigo", referencedColumnName = "codigo")
})
@JsonManagedReference
private List<Operacao> operacoes;
}
@Embeddable
public class OperacaoPK implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne()
@JoinColumns({
@JoinColumn(name = "roteiro_produto_codigo", nullable = false, referencedColumnName = "produto_codigo"),
@JoinColumn(name = "roteiro_codigo", nullable = false, referencedColumnName = "codigo")
})
@JsonBackReference
private Roteiro roteiro;
@Column(name = "codigo")
private String codigo;
}
@Entity
@Table(name = "tb_operacao")
public class Operacao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private OperacaoPK operacaoPK;
private int quant;
}
Veja que a Classe “Roteiro” possui uma lista de Operações (OneToMany), e a classe “Operacao” tem como chave primária composta a chave primária de Roteiro com relação (ManyToOne) + o código da operação, e ai que esta o problema, não consigo usar corretamente as anotações @JsonManagedReference
e @JsonBackReference
, também tentei @JsonIdentifyInfo
, segue abaixo o arquivo JSON que preciso que seja desserealizado é o seguinte.
{
"roteiroPK": {
"produto": {
"codigo": "P001"
},
"codigo": "R1"
},
"descricao": "ROTEIRO TESTE",
"operacoes": [
{
"operacaoPK": {
"roteiro": {
"roteiroPK": {
"produto": {
"codigo": "P001"
},
"codigo": "R1"
}
},
"codigo": "O1"
},
"descricao": "OPERACAO TESTE 1"
},
{
"operacaoPK": {
"roteiro": {
"roteiroPK": {
"produto": {
"codigo": "P001"
},
"codigo": "R1"
}
},
"codigo": "O2"
},
"descricao": "OPERACAO TESTE 2"
}
]
}
Mas ocorre o seguinte erro:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference
'defaultReference': no back reference property found from type [collection type; class java.util.List,
contains [simple type, class br.com.baterax.bateraxmes.model.Operacao]]
at [Source: (io.undertow.servlet.spec.ServletInputStreamImpl); line: 1, column: 1]
Quanto tento serializar, não ocorre erro, gerando o seguinte JSON:
{
"roteiroPK": {
"produto": {
"codigo": "P001"
},
"codigo": "R1"
},
"descricao": "ROTEIRO TESTE",
"operacoes": [
{
"operacaoPK": {
"codigo": "O1"
},
"descricao": "OPERACAO TESTE 1"
},
{
"operacaoPK": {
"codigo": "O2"
},
"descricao": "OPERACAO TESTE 2"
}
]
}
Nele foi omitido o seguinte trecho que vai dentro de operacaoPK, isto devido ao JsonBackReference
, quanto a isso não vejo problemas, mas preciso resolver o problema de não conseguir desserializar o JSON que envio, se eu tentar copiar este JSON gerado e enviar pelo POSTMAN, ocorre erro do mesmo jeito, mesmo ainda se eu tentar inserir o trecho faltante ou não.
"roteiroPK": {
"produto:" {
"codigo": "050210001"
},
"codigo": "01"
},