Hibernate 配置Jackson以在Spring引导中省略延迟加载属性

Hibernate 配置Jackson以在Spring引导中省略延迟加载属性,hibernate,spring-boot,jackson,lazy-loading,Hibernate,Spring Boot,Jackson,Lazy Loading,在纯java配置的spring boot mvc项目中,如何配置Jackson以省略延迟加载属性如果您正在使用SpringBoot,理想情况下您应该已经有了Hibernate4Module。 否则,请添加此依赖项 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-hiberna

在纯java配置的spring boot mvc项目中,如何配置Jackson以省略延迟加载属性

如果您正在使用SpringBoot,理想情况下您应该已经有了Hibernate4Module。 否则,请添加此依赖项

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate4</artifactId>
        <version>2.5.3</version>
    </dependency>
有关Hibernate的不同版本,请参阅以下Hibernate模块:

// for Hibernate 4.x:
mapper.registerModule(new Hibernate4Module());
// or, for Hibernate 5.x
mapper.registerModule(new Hibernate5Module());
// or, for Hibernate 3.6
mapper.registerModule(new Hibernate3Module());
现在,您需要通过消息转换器注册您的HibernateAwareObject映射器。为此,创建一个扩展WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter的配置类。(如果您已经有了一个,请执行下一步)

现在使用HibernateObjectMapper注册MessageConverter:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
    List<MediaType> supportedMediaTypes=new ArrayList<>();
    supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    supportedMediaTypes.add(MediaType.TEXT_PLAIN);
    MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(new HibernateAwareObjectMapper());
    converter.setPrettyPrint(true);
    converter.setSupportedMediaTypes(supportedMediaTypes);
    converters.add(converter);
    super.configureMessageConverters(converters);
}
@覆盖

公共无效配置MessageConverters(列表对我来说,实现这一点最简单的方法是扩展
WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
并覆盖
extendedmessageconverters
方法。我在里面搜索了
MappingJackson2HttpMessageConverter
,刚刚注册了Jackson Hibernate模块

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class CustomWebMvcAutoConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
{
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate4Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}
@配置
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
公共类CustomWebMvcAutoConfig扩展了WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
{
@凌驾

public void extendMessageConverters(列表对于最新版本的Spring Boot,这要容易得多

任何类型为com.fasterxml.jackson.databind.Module的bean都将自动向自动配置的Jackson2ObjectMapperBuilder注册,并应用于它创建的任何ObjectMapper实例。这为向应用程序添加新功能时贡献自定义模块提供了一种全局机制

首先确保您具有所需的Jackson依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>

@Grzegorz所写的内容对我来说是完美的。仅在这里介绍不带自定义类的his解决方案:

编辑:我在RestController域中

@Configuration
public class CustomWebMvcAutoConfig extends WebMvcConfigurerAdapter
{
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}
@配置
公共类CustomWebMvcAutoConfig扩展了WebMVCConfigureAdapter
{
@凌驾

public void extendMessageConverters(列表I用户springboot和hibernamte5.0.x。 它起作用了

1.pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.4</version>
</dependency>

com.fasterxml.jackson.datatype
jackson-datatype-hibernate5
2.8.4
2.网络配置

@Configuration
public class WebConfig implements WebMvcConfigurer {

    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}
@配置
公共类WebConfig实现WebMVCConfiguer{

公共无效扩展消息转换器(列表仅列出一件小事……请确保您正在扩展org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter,而不是spring boot的。但是spring5 WebMVCConfigureAdapter已被弃用……这个答案有更新吗?你是一位幸运的圣人。在我切换到这种配置方法之前,你没有在这个应用程序中工作过:OThanks@Grze)gorz,你让我走出了2天的地狱!这对我来说非常有效。我在RestController域中,使用hibernate 5。Spring完成Json Jackson自动序列化,hibernate会话和FetchType LAZY或Earge现在以需要的方式一起工作。注意:现在不需要任何@JsonInclude(JsonInclude.Include.NON_缺席/NON_空/等)获取此org.springframework.beans.factory.BeanCreationException:创建名为com.example.app.in28分钟层次结构实体应用程序中定义的“hibernate5Module”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstationException:实例化失败[com.fasterxml.jackson.databind.Module]:工厂方法“hibernate5Module”引发异常;嵌套异常为java.lang。错误:未解决的编译问题:hibernate5Module无法解析为类型欢迎使用堆栈溢出!发布答案时,请确保您正在解释问题是什么以及需要如何解决,而不仅仅是发布代码。[如何回答]()是一个关于如何编写堆栈溢出的好答案的很棒的文档。(有趣的是,SpringBoot文档说,如果模块是由@Bean注释的方法提供的,那么它可以注册该模块,但是)对我来说,除了这个解决方案之外,没有一个解决方案是有效的。
@Configuration
public class CustomWebMvcAutoConfig extends WebMvcConfigurerAdapter
{
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.4</version>
</dependency>
@Configuration
public class WebConfig implements WebMvcConfigurer {

    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}