当前位置: 首页 > 面试题库 >

如何自定义Spring Boot隐式使用的Jackson JSON映射器?

葛景龙
2023-03-14
问题内容

我正在使用Spring Boot(1.2.1),其方式与他们的Build RESTful Web Service教程中的方式类似:

@RestController
public class EventController {

    @RequestMapping("/events/all")
    EventList events() {
        return proxyService.getAllEvents();
    }

}

因此,在上面,Spring MVC隐式使用Jackson将我的EventList对象序列化为JSON。

但我想对JSON格式进行一些简单的自定义,例如:

setSerializationInclusion(JsonInclude.Include.NON_NULL)

问题是,定制隐式JSON映射器的最简单方法是什么?

我在此博客文章中尝试了该方法,创建了CustomObjectMapper,依此类推,但是步骤3“在Spring上下文中注册类”失败了:

org.springframework.beans.factory.BeanCreationException: 
  Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed; 
  nested exception is org.springframework.beans.factory.BeanCreationException: 
  Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter); 
  nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]   
  found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

看起来这些说明适用于旧版本的Spring MVC,而我正在寻找一种简单的方法来使此功能与最新的Spring Boot一起使用。


问题答案:

如果你使用的是Spring Boot 1.3,则可以通过application.properties以下命令配置序列化包含:

spring.jackson.serialization-inclusion=non_null

在Jackson 2.7中进行了更改之后,Spring Boot 1.4使用名为的属性spring.jackson.default-property-inclusion代替:

spring.jackson.default-property-inclusion=non_null

请参阅Spring Boot文档中的“ 自定义Jackson ObjectMapper ”部分。

如果你使用的是Spring Boot的早期版本,则配置Spring Boot中包含的序列化的最简单方法是声明自己的,适当配置的Jackson2ObjectMapperBuilderbean。例如:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    return builder;
}


 类似资料:
  • 我有两个对象,除了date成员外,其他成员都相同。在obj1中,date是java.sql.date,obj2.date是long(纪元)。 我需要编写一个映射器来将obj1映射到obj2。这就是我试图做的: 但是mapperImpl只有自己的日期转换实现: 我得到了: 这种转换的正确方式是什么?

  • 我正在使用Spring Boot(1.2.1),其方式与构建RESTful Web服务教程类似: 上面,Spring MVC隐式地使用Jackson将我的对象序列化为JSON。 但是我想对JSON格式做一些简单的自定义,比如: 问题是,定制隐式JSON映射器的最简单方法是什么? 我尝试了这篇博文中的方法,创建CustomObjectMapper等,但步骤3“在Spring上下文中注册类”失败了:

  • 我有一个自定义的Request estMappingHandlerMap类,它将特殊注释解释为其映射条件的一部分。因此它被实例化为bean: 但是当我创建一个MockMvc对象进行测试时(使用Standard aloneSetup),没有使用这个映射处理程序。如果不考虑额外的注释,映射会失败,因为我有多个具有相同@Request estMap的控制器方法。注释是区分它们的原因。 如何配置MockM

  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。