以下解决方案是针对Spring 4.3(非引导)和Hibernate 5.1的,出于性能原因,我们将所有fetchtypes转换为fetch=FetchType.LAZYfrom的情况fetch=FetchType.EAGER。随即我们发现com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy由于延迟加载问题而导致的异常。
首先,我们添加以下Maven依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>
然后将以下内容添加到我们的Java MVC配置文件中:
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
Hibernate5Module h5module = new Hibernate5Module();
h5module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
h5module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);
for (HttpMessageConverter<?> mc : converters){
if (mc instanceof MappingJackson2HttpMessageConverter || mc instanceof MappingJackson2XmlHttpMessageConverter) {
((AbstractJackson2HttpMessageConverter) mc).getObjectMapper().registerModule(h5module);
}
}
return;
}
笔记:
您需要创建和配置Hibernate5Module才能获得与没有此模块的杰克逊相似的行为。默认设置不兼容。
我们WebMvcConfigurerAdapter还有很多其他配置,我们想避免使用另一个配置类,这就是为什么我们不使用WebMvcConfigurationSupport#addDefaultHttpMessageConverters其他文章中提到的功能的原因。
WebMvcConfigurerAdapter#configureMessageConverters禁用所有Spring消息转换器的内部配置。我们希望避免与此相关的潜在问题。
使用extendMessageConverters启用的对所有自动配置的Jackson类的访问,而不会丢失所有其他消息转换器的配置。
通过使用getObjectMapper#registerModule我们,我们可以将它们添加Hibernate5Module到现有的转换器中。
- 该模块已添加到JSON和XML处理器中
此添加解决了Hibernate和延迟加载的问题,但是导致了生成的JSON格式的残留问题。如该github问题中所述,hibernate-jackson延迟加载模块当前忽略@JsonUnwrapped注释,从而导致潜在的数据错误。无论强制加载功能设置如何,都会发生这种情况。自2016年以来一直存在问题。
注意
看来,通过将以下内容添加到延迟加载的类中,内置的ObjectMapper可以工作而无需添加hibernate5模块:
@JsonIgnoreProperties( {"handler","hibernateLazyInitializer"} )
public class Anyclass {