配置 Jackson 以在 Spring Boot 中忽略延迟加载属性

Configure Jackson to omit lazy-loading attributes in Spring Boot

在spring boot mvc project with pure java配置如何配置Jackson省略延迟加载属性

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

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

接下来创建一个名为 "HibernateAwareObjectMapper" 的 class 或您想要的任何名称:

内容如下:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;

    public class HibernateAwareObjectMapper extends ObjectMapper {

        public HibernateAwareObjectMapper() {
            registerModule(new Hibernate4Module());
        }
    }

对于不同版本的 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());

现在您需要通过消息转换器注册您的 HibernateAwareObjectMapper。为此,创建一个 Config class extends extends 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);
}

中提琴!!!这应该足够了。 这是针对 spring 引导 Web 应用程序执行此操作的纯 java(无 xml)方式。

如果您想添加到答案中,请随时发表评论。

对我来说,实现此目的的最简单方法是扩展 WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter 并覆盖 extendMessageConverters 方法。我在里面搜索了 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.
            }
        }
    }
}

这样您就不会丢失所有由 Spring 配置的默认转换器。

使用最新版本的 Spring 引导,这要容易得多。

Any beans of type com.fasterxml.jackson.databind.Module will be automatically registered with the auto-configured Jackson2ObjectMapperBuilder and applied to any ObjectMapper instances that it creates. This provides a global mechanism for contributing custom modules when you add new features to your application.

74.3 Customize the Jackson ObjectMapper

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

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

然后您可以将该模块作为 @Bean 包含在应用程序上下文中。

@Bean
public Module hibernate4Module()
{
    return new Hibernate4Module();
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
    objectMapper.registerModule(new Hibernate5Module());


    return jsonConverter;
}

@Grzegorz 写的非常适合我。只是在这里展示他的解决方案,没有他的习惯 类:

编辑:我在 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.
            }
        }
    }
}

我使用 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>

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.
            }
        }
    }
}