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
答案 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被阻止,因此没有复制和粘贴......