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

新手上路,请多包涵

我正在使用 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: {}

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

原文由 Jonik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 644
2 个回答

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

 spring.jackson.default-property-inclusion=non_null

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

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

上下文的 Jackson2ObjectMapperBuilder 可以由一个或多个 Jackson2ObjectMapperBuilderCustomizer bean 自定义。可以订购此类定制器 bean(Boot 自己的定制器的顺序为 0),允许在 Boot 定制之前和之后应用额外的定制。

最后,如果您不想要 Boot 的任何配置,并且想要完全控制 ObjectMapper 的配置方式,请声明您自己的 Jackson2ObjectMapperBuilder bean:

 @Bean
Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    // Configure the builder to suit your needs
    return builder;
}

原文由 Andy Wilkinson 发布,翻译遵循 CC BY-SA 4.0 许可协议

我回答这个问题有点晚了,但将来有人可能会觉得这很有用。除了许多其他方法之外,下面的方法效果最好,我个人认为它更适合 Web 应用程序。

 @Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

 ... other configurations

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
        builder.serializationInclusion(Include.NON_EMPTY);
        builder.indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
}

原文由 vvra 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题