En mi proyecto Spring 4 con Hibernate 5 y una configuración basada en Java, sigo enfrentándome a la excepción "no se pudo inicializar el proxy, no hay sesión" cada vez que Jackson intenta serializar mi entidad con una colección perezosa. Parece que Jackson no verifica si la colección es perezosa y activa la carga, lo que genera la excepción. ¿Cómo hago para que Jackson evite la serialización de cada colección con carga diferida en cada @Entity-class y así evitar excepciones constantes y fallas con "sin sesión"? La solución de trabajo más simple. He leído muchos enfoques, ninguno de los cuales realmente resuelve este problema para mí. Cualquier ayuda será apreciada (¡no para Spring Boot!). Algún fragmento de código:
@Data @Entity @ToString(exclude="questions") @Table(name = "theme") public class Theme { @Id @GeneratedValue(generator = "increment") @GenericGenerator(name = "increment", strategy = "increment") @Column(name = "id") private Long id; @Column(name = "title") private String title; @JsonInclude(JsonInclude.Include.NON_NULL) @OneToMany // LAZY by default @JoinColumn(name = "theme") private List<Question> questions;// = new ArrayList<>(); }DAO
public interface ThemeDAO extends CrudRepository<Theme, Long> { List<Theme> findAll(); }La excepción va aquí (en el controlador):
ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.writeValueAsString(theme);El complemento jackson-datatype-hibernate realmente resolvió el problema. Acabo de agregar HibernateAwareObjectMapper como una clase separada:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; public class HibernateAwareObjectMapper extends ObjectMapper { public HibernateAwareObjectMapper() { registerModule(new Hibernate5Module()); }}
Y luego anuló el método configureMessageConverters en la clase de configuración de MVC:
@Configuration @EnableWebMvc @ComponentScan(basePackages = { "learning_session.controller" }) public class WebContext extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter(new HibernateAwareObjectMapper())); super.configureMessageConverters(converters); } // more beans }