java - tutorial - Diferencia entre @JsonIgnore y @JsonBackReference, @JsonManagedReference
jsonmanagedreference not working (2)
se utilizan para resolver la recursividad infinita (StackOverflowError)
@JsonIgnore
no está diseñado para resolver el problema de
recursión infinita
, simplemente ignora la propiedad anotada de ser serializada o deserializada.
Pero si hubo un enlace bidireccional entre los campos, ya que
@JsonIgnore
ignora la propiedad anotada, puede evitar la recursión infinita.
Por otro lado,
@JsonManagedReference
y
@JsonBackReference
están diseñados para manejar este vínculo bidireccional entre los campos, uno para el rol principal, el otro para
el
rol
@JsonBackReference
, respectivamente:
Para evitar el problema, la vinculación se maneja de tal manera que la propiedad anotada con la anotación
@JsonManagedReference
se maneja normalmente (serializada normalmente, sin manejo especial para la deserialización) y la propiedad anotada con la anotación@JsonBackReference
no se serializa; y durante la deserialización, su valor se establece en una instancia que tiene el enlace "administrado" (hacia adelante).
En resumen, si no necesita esas propiedades en el proceso de serialización o deserialización, puede usar
@JsonIgnore
.
De lo contrario, usar el par
@JsonManagedReference
/
@JsonBackReference
es el camino a seguir.
Sé que
@JsonIgnore
y
@JsonManagedReference
,
@JsonBackReference
se usan para resolver la
Infinite recursion (StackOverflowError)
, ¿cuál es la diferencia entre estos dos?
Nota: Estas son anotaciones de Jackson.
Supongamos que tenemos
private class Player {
public int id;
public Info info;
}
private class Info {
public int id;
public Player parentPlayer;
}
// something like this:
Player player = new Player(1);
player.info = new Info(1, player);
Publicación por entregas
@JsonIgnore
private class Info {
public int id;
@JsonIgnore
public Player parentPlayer;
}
y
@JsonManagedReference
+
@JsonBackReference
private class Player {
public int id;
@JsonManagedReference
public Info info;
}
private class Info {
public int id;
@JsonBackReference
public Player parentPlayer;
}
producirá la misma salida.
Y la
salida
para el caso de demostración desde arriba es:
{"id":1,"info":{"id":1}}
Deserialización
Aquí está la principal diferencia, porque la deserialización con
@JsonIgnore
simplemente establecerá nulo en el campo, por lo que en nuestro ejemplo parentPlayer será == nulo.
Pero con
@JsonManagedReference
+
@JsonBackReference
obtendremos
Info
referencia allí