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.

Jesús Perales

Read more posts by this author.

Subscribe to Jesús Perales

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!