/ Java

com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: no session, Solución

Esta excepción se nos presenta al utilizar la carga perezosa (Lazy Load) de Hibernate al momento de que Jackson intenta convertir nuestra entidad a un JSON.

Para solucionar este error es necesario agregar la dependencia Jackson datatype Hibernate, mi pom.xml se ve así.

<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>${jackson.version}</version>
</dependency>
   
<dependency>
	<groupId>com.fasterxml.jackson.datatype</groupId>
	<artifactId>jackson-datatype-hibernate4</artifactId>
	<version>${jackson.version}</version>
</dependency>
<!-- jackson -->

Necesitamos registrar este modulo de Jackson, primero crearemos una clase llamada HibernateAwareObjectMapper que hereda de ObjectMapper y contendrá el siguiente código:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;

public class HibernateAwareObjectMapper extends ObjectMapper {

	private static final long serialVersionUID = 1L;

	public HibernateAwareObjectMapper() {
        registerModule(new Hibernate4Module());
    }
}

El ultimo paso es agregar esta clase como un convertidor de mensajes de Spring en el archivo de configuración de esta forma:

<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- Use the HibernateAware mapper instead of the default -->
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="ruta.a.tu.clase.HibernateAwareObjectMapper" />
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

Con esto las colecciones que se obtienen mediante Lazy Load funcionaran de forma transparente.