当前位置: 首页 > 知识库问答 >
问题:

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

梁丘波鸿
2023-03-14

我正在使用Spring Boot(1.2.1),其方式与构建RESTful Web服务教程类似:

@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: {}

共有1个答案

太叔何平
2023-03-14

您可以通过application.properties配置属性包含和许多其他设置:

spring.jackson.default-property-inclusion=non_null

文档中有一个表列出了所有可以使用的属性。

如果您想要更多的控制,还可以使用Jackson2ObjectMapperBuilderCustomizerbean编程自定义Spring Boot的配置,如文档中所述:

上下文的Jackson2ObjectMapperBuilder可以由一个或多个Jackson2ObjectMapperBuilderCustomizerbean自定义。这样的定制器bean是可以排序的(引导自己的定制器的排序为0),允许在引导定制之前和之后应用额外的定制。

最后,如果您不想使用任何引导配置,并且希望完全控制ObjectMapper的配置方式,请声明您自己的Jackson2ObjectMapperBuilderbean:

@Bean
Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    // Configure the builder to suit your needs
    return builder;
}
 类似资料:
  • 问题内容: 我正在使用Spring Boot(1.2.1),其方式与他们的Build RESTful Web Service教程中的方式类似: 因此,在上面,Spring MVC隐式使用Jackson将我的对象序列化为JSON。 但我想对JSON格式进行一些简单的自定义,例如: 问题是,定制隐式JSON映射器的最简单方法是什么? 我在此博客文章中尝试了该方法,创建了CustomObjectMapp

  • 我已经为这些列表创建了模型类,这些列表是我收到的对我的服务的响应 清单1 清单2 列表3是最后的列表,上面两个列表映射的结果,即我的服务的响应 清单3 这些列表与用户名和用户标签相连。我已将列表1的所有值映射到列表3。现在对于列表2,我需要检查每个userLabel是否在list3中存在一个userName等于userLabel的对象,如果为true,则totalUsers的值设置为list3的那

  • 为了编写所需的最少代码量,我尝试让ModelMapper生成其隐式映射,并且只为那些无法自动映射的属性编写显式属性映射。 如果我让ModelMapper使用以下命令生成隐式映射: 它抱怨具有多个可能的映射。然后,我尝试使用以下方法修复该问题: 然而,我发现ModelMapper仍在抱怨,因为实际上在上抛出了一个异常,所以它没有机会访问我的自定义映射代码。 如果我反转这两个语句,我会得到一个错误:

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

  • 假设我有很多团队,比如:“团队A,团队B…团队Z”,每个团队至少有5个组件。现在我想创建一个通用控制器,它可以响应任何类型的请求,这样我就可以获得关于团队成员的信息。 例如,我的控制器必须能够映射此请求: 团队课程可以是: 而且 显然它既可以执行也可以执行,重点是我不想为每个团队和每个数字指定一个控制器,我只想要一个可以响应的控制器。 我还需要指定它可以接受的字符串和值的范围(例如,最大值为5)。

  • 问题内容: 如果名称和名称相同,默认情况下MapStruct将映射源和目标的所有属性。尽管我们可以在@Mapping中使用ignore属性来省略任何字段映射。但这不是我想要的。我想控制映射策略。我必须指定类似 现在此映射仅用于将ID和名称从源映射到目标。除非在映射注释中指定,否则不应映射其他字段。 问题答案: 您正在寻找的是#1392中 的功能请求。有一个待定的PR,因此可以在下一版本(1.3.0