json - with - Perder los datos del niño en una relación bidireccional al usar jacksonMapper
jsonignore (1)
Tengo dos clases como se muestra a continuación en una relación bidireccional de Muchos a Muchos:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
Child implements Serializable{
@ManytoMany(//declaration for join table)
@JsonManagedReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Parent> parentSet;
// other getter and setters
}
Hago una llamada en mi DAO para obtener un padre en particular. Junto con los detalles principales quiero buscar a los hijos del padre. Algo como esto:
Hibernate.initialize(parent.getChildSet()); //this works perfectly
// and I get the details of parent along with the children in my DAO call.
Pero cuando hago lo siguiente en mi servicio comercial mientras devuelvo los datos al controlador, los hijos se omiten de la cadena padre json.
jacksonMapper.writeValueAsString(parent);
Así que eliminé el atributo @JsonIgnore on Child dentro de Parent class pensando que Jackson podría entender que estos campos no se deben ignorar mientras se escribe en una cadena como se muestra a continuación. ¡Pero todavía los ignora! :(
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
//@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
¿Alguna idea de dónde podría estar yendo mal?
No he podido averiguar por qué sucede esto. Mientras tanto, he optado por una solución alternativa. Estoy haciendo dos llamadas separadas a DB. Uno para buscar primero el padre y luego el segundo para buscar al niño según el padre padre obtenido.
Alternativamente, puedo hacer ambas llamadas a DB en el servicio al mismo tiempo y preparar el JSON como una cadena compleja antes de enviarlo a la interfaz de usuario:
complex:{
parent:parent,
child:child
}
En cualquier caso, es una solución. La solución ideal es simplemente eliminar @ JsonIgnore en el mapeo solo desde el lado padre de la clase hija. Pero de alguna manera eso no parece funcionar. ¡Publicaré en caso de que encuentre por qué la solución "ideal" no funciona!
Solución ideal Actualizado como respuesta el 15 de agosto de 2016 El Día de la Independencia de la India:
El problema está en el mapeo:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
Cuando dices @JsonBackReference, en realidad significa ignorar este campo mientras escribes el Json, es decir,
@JsonBackReference <-> @JsonIgnore
Por lo tanto, el niño se omite cuando el padre se serializa. Con las correlaciones de ORM siempre es una buena práctica tener las anotaciones de una cara en lugar de doble. De esta forma, puede evitar una gran cantidad de excepciones no deseadas mientras recupera los datos y, en segundo lugar, mantener limpio su código comercial.