配置Jackson进行Spring集成

时间:2017-11-13 18:29:22

标签: jackson spring-integration

this question中曾提到同一项目的另一个问题。我们现在已经开发了很多路由来从复合后端提供REST / JSON Web服务。

端点是< int-http:inbound-gateway>从请求和对象执行对象的隐式JSON到响应的JSON。 现在我们真的需要调整Jackson以解决我们在响应中提供的JSON的一些问题。没什么花哨或不寻常的:主要是将日期作为String而不是Timestamps,删除null属性,注册JSR-310模块。

对于平台中的其他模块,我们使用带有@Configuration类的Java DSL和类似这样的bean:

@Configuration
public class ControllerConfig {
  @Bean
  @Primary
  public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.setSerializationInclusion(Include.NON_NULL);
    return objectMapper;
  }
}

但它似乎对Spring Integration没有影响。我也试过Spring Boot配置:

spring.jackson.default-property-inclusion=NON_NULL

它也不起作用。我仔细阅读this thread,我对Artem Bilan的回答是,Spring Integration不会考虑Spring Boot配置。

所以......我感觉很愚蠢:在Spring Integration中为Jackson全局配置的规范方法是什么?

jackson 2.8.7 / spring 4.3.7 / spring boot 1.5.2 / spring integration 4.3.8

2 个答案:

答案 0 :(得分:1)

正确。 Spring Integration是一个纯粹的Spring Framework扩展,它对传统的自动配置和注入确实一无所知。

所以,你要做的就是不要忘记在必要的时候注射你的objectMapper

例如,对于<int-http:inbound-gateway>,您必须注入一组HttpMessageConverter。例如,我看到Spring Boot提供了HttpMessageConverters bean。我相信MappingJackson2HttpMessageConverter会向JacksonHttpMessageConvertersConfiguration注入<int-http:inbound-gateway message-converters="#{messageConverters.converters}"> 。因此,您可以将它用于您的目的:

var poll = Observable.Interval(TimeSpan.FromSeconds(1));
var lessFrequentPoll = Observable.Interval(TimeSpan.FromSeconds(15));

poll.Subscribe(o => application.UpdateFrequent(o));
lessFrequentPoll.Subscribe(o => application.UpdateLessFrequent(o));

答案 1 :(得分:1)

非常感谢@Artem Bilan迅速回答我的问题并告诉我要走的路(在我独自战斗了两天之后)。

自定义HttpMessageConverter确实是一个好方向。下面的代码并不是我编写过的最好的代码,但它可以很好地完成工作。我已将此节添加到我们的@Configuration bean:

@Bean
public List<HttpMessageConverter<?>> customMessageConverters() {
  MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.registerModule(new JavaTimeModule());
  objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  objectMapper.setSerializationInclusion(Include.NON_NULL);
  jsonConverter.setObjectMapper(objectMapper);

  List<HttpMessageConverter<?>> result = new ArrayList<HttpMessageConverter<?>>();
  result.add(jsonConverter);

  return result;
}

然后,Artem Bilan提出的魔术效果很好:我们刚刚添加了

message-converters="customMessageConverters"

到我们的入站网关。

我希望有一天能帮助别人。我为任何拼写错误道歉,但所有这些都是在银行编码,其中发布到StackOverflow被阻止,因此没有复制和粘贴......