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.