recursividad programacion estructura ejemplos definicion datos caracteristicas arbol java jackson orientdb

java - estructura - recursividad en programacion



RecursiĆ³n infinita al serializar OrientDB RecordID (1)

En mi esquema tengo una clase abstracta como esta:

@JsonAutoDetect(JsonMethod.NONE) public abstract class AbstractEntity { @Id private Object id; @Version private Integer version; public AbstractEntity() {} @JsonProperty // this annotation causes infinite recursion public Object getId() { return id; } }

Esta clase se usa como superclase para cada entidad, por ejemplo:

@JsonAutoDetect(JsonMethod.NONE) public class Usuario extends AbstractEntity { private Cadastro cadastro; protected Usuario() {} public Usuario(Cadastro cadastro) { setCadastro(cadastro); } @JsonProperty public Cadastro getCadastro() { return cadastro; } @JsonProperty public void setCadastro(Cadastro cadastro) { this.cadastro = cadastro; } }

Estoy diseñando una capa REST que permitirá a los usuarios crear registros en db a través de la solicitud / respuesta JSON:

@POST @Path("cadastrar") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response cadastrar(@Context HttpServletRequest request, Cadastro cadastro) { OObjectDatabaseTx bd = (OObjectDatabaseTx) request.getAttribute("object.database.tx"); try { bd.begin(); Usuario usuario = new Usuario(cadastro); usuario = bd.save(usuario); bd.commit(); String json = new ObjectMapper().writeValueAsString(usuario); Response response = Response.status(HttpURLConnection.HTTP_CREATED).entity(json).build(); return response; (...)

Sin embargo, en este último método, cuando llamo a Jackson para serializar mi entidad recién creada (en el método writeValueAsString ), obtengo una recursión infinita:

org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODocument["identity"] ->com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODocument["identity"] ->com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODoc...

Puedo evitar la recursión infinita eliminando @JsonProperty del método getId en la clase AbstractEntity . Sin embargo, de esta manera, la propiedad id no estará presente en la respuesta JSON.

Entonces, ¿cómo puedo serializar la propiedad de id ?

¡Gracias!


¿Jackson admite referencias circulares? Es ese el caso?