Json y Java – Referencia circular

Estoy teniendo y problema con la referencia Circular.

Tengo Rest Webservices que devuelve los objetos a la interfaz, el problema es cuando trato de devolver objetos que tienen varias referencias, así que como resultado obtengo una respuesta infinita, que genera

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 

Los objetos son generados automáticamente por Hibernate Code Generation y necesito tener la referencia circular en el backend, solo necesito quitarlo antes de enviar la información a la interfaz usando Jackson.

El encabezado del método del controlador es:

 @RequestMapping(value="/list", method=RequestMethod.POST) public @ResponseBody eventResponse list(@RequestBody String sessionID) { 

No estoy haciendo nada explícito para convertir a Json, soy un recién llegado con esto y creo que Jackson resolvió esto automáticamente.

Hay dos formas de hacerlo. Si debe exponer su entidad al mundo exterior, le recomiendo agregar @JsonIgnore en la propiedad que está causando la referencia circular. Esto le dirá a Jackson que no serialice esa propiedad.

Otra forma es usar las características bidireccionales proporcionadas por Jackson. Puede usar @JsonManagedReference o @JsonBackReference . @JsonManagedReference es la parte “hacia adelante” de la propiedad y se serializará normalmente. @JsonBackReference es la parte “posterior” de la referencia; no se serializará, pero se reconstruirá cuando se deserialice el tipo “reenviar”.

Puedes ver los ejemplos aquí .

Esto responde a su comentario: creo que lo que podría querer hacer en este caso es usar un DTO que sea visible para el mundo exterior. Me gusta este enfoque porque no quiero exponer mis entidades al exterior. Esto significa que las anotaciones de Jackson estarían en el DTO y no en la enity. Necesitarías algún tipo de mapeador o convertidor que convierta la entidad a DTO. Ahora cuando realice cambios en su entidad, no se propagarán a la DTO a menos que modifique su correlacionador / convertidor. Creo que esto está bien, porque cuando haces un cambio en tu entidad puedes decidir si quieres que ese cambio se exponga o no.

ACTUALIZAR

Aquí hay una buena publicación de blog que detalla las diversas formas en que puede manejar las relaciones bidireccionales en Jackson. Describe las soluciones que usan @JsonIgnore , @JsonManagedReference y @JsonBackReference , @JsonIdentityInfo , @JsonView y un serializador personalizado también. Es una descripción bastante completa de las diversas técnicas que puede usar.

Una sola anotación @JsonIdentityInfo resuelve el problema. Maneja referencias circulares también. Referencia