在我使用 Hibernate 5 和基于 Java 的配置的 Spring 4 项目中,每次 Jackson 尝试使用惰性集合序列化我的实体时,我都会遇到异常“无法初始化代理 - 无 session ”。 jackson 似乎无法检查集合是否懒惰并触发加载从而生成异常。 我如何让 Jackson 避免对每个 @Entity 类上的每个延迟加载集合进行序列化,从而避免不断出现异常并因“无 session ”而失败?最简单的工作解决方案。 我读过很多方法,其中一些确实为我解决了这个问题。 任何帮助将不胜感激(不适用于 Spring Boot!)。 一些代码片段:
@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<>();
}
道
public interface ThemeDAO extends CrudRepository<Theme, Long> {
List<Theme> findAll();
}
此处出现异常(在 Controller 中):
ObjectMapper objectMapper = new ObjectMapper();
result = objectMapper.writeValueAsString(theme);
最佳答案
jackson-datatype-hibernate插件确实解决了问题。 我只是将 HibernateAwareObjectMapper 添加为一个单独的类:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
registerModule(new Hibernate5Module());
}
然后覆盖 MVC 配置器类中的 configureMessageConverters 方法:
@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
}
关于spring - Jackson:从序列化中排除@Entity 类上的每个惰性集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43232264/