working tutorial stackoverflowerror not jsonmanagedreference jsonidentityinfo jsonbackreference and java json jackson

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í