我正在尝试使用杰克逊在骆驼路线的JSON上对POJO进行序列化和反序列化。其中一些具有Java 8 LocalDate字段,我希望将它们序列化为YYYY- MM-DD字符串,而不是整数数组。
我们仅将Java配置用于Spring Boot应用程序,因此不使用XML Camel配置。
我已经成功创建了一个ObjectMapper,它可以实现我想要的功能,通过将其添加到我们的依赖项中,我们的系统其他部分正在使用它:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
这是我们的应用程序配置:
@Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { return builder .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .build(); }
出站REST路由示例:
@Component public class MyRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { restConfiguration().component("servlet").contextPath("/mycontext") .port(8080).bindingMode(RestBindingMode.json); rest("/myendpoint) .get() .route() .to("bean:myService?method=myMethod()"); } }
传入消息路由示例:
@Component public class MyRouteBuilder extends RouteBuilder { @Autowired private MyBean myBean; @Override public void configure() { from(uri) .unmarshal().json(JsonLibrary.Jackson) .bean(myBean); } }
但是,默认情况下,骆驼会创建自己的ObjectMapper实例,因此不会在Jackson2ObjectMapperBuilder自动添加的JSR310序列化器/反序列化器或禁用的WRITE_DATES_AS_TIMESTAMPS功能上启用。我已经阅读了Camel JSON文档,但是没有显示如何使用Spring配置添加自定义DataFormat,或者如何为所有类型应用全局自定义。
Jackson2ObjectMapperBuilder
WRITE_DATES_AS_TIMESTAMPS
那么如何仅使用Spring Boot Java配置告诉Camel使用我的ObjectMapper?
通过逐步浏览Camel代码,我找到了解决方案。因此,尽管它可以满足我的要求,但它可能无法与Camel的将来版本一起使用,因为它似乎没有文档记录,并且可能不受支持。
我要做的就是将以下bean添加到我的Spring配置中,除了ObjectMapper问题中的bean:
ObjectMapper
@Bean(name = "json-jackson") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public JacksonDataFormat jacksonDataFormat(ObjectMapper objectMapper) { return new JacksonDataFormat(objectMapper, HashMap.class); }
要注意的关键点:
JacksonDataFormat
HashMap.class
SCOPE_PROTOTYPE
DataFormat