一尘不染

如何在Spring Boot中为Camel配置Jackson ObjectMapper

spring-boot

我正在尝试使用杰克逊在骆驼路线的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,或者如何为所有类型应用全局自定义。

那么如何仅使用Spring Boot Java配置告诉Camel使用我的ObjectMapper?


阅读 525

收藏
2020-05-30

共1个答案

一尘不染

通过逐步浏览Camel代码,我找到了解决方案。因此,尽管它可以满足我的要求,但它可能无法与Camel的将来版本一起使用,因为它似乎没有文档记录,并且可能不受支持。

我要做的就是将以下bean添加到我的Spring配置中,除了ObjectMapper问题中的bean:

@Bean(name = "json-jackson")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public JacksonDataFormat jacksonDataFormat(ObjectMapper objectMapper) {
    return new JacksonDataFormat(objectMapper, HashMap.class);
}

要注意的关键点:

  • 有没有构造函数JacksonDataFormat接受一个ObjectMapper无解组型。但是,在默认构造函数中,HashMap.class当未提供非编组类型时使用a ,因此我使用它。通过某种魔术,这似乎可以用来解组所有POJO类型。如果您还需要其他类别的更具体的数据格式,则也需要ObjectMapper在其中设置。
  • Camel似乎在bean注册表中搜索了一个名为“ json-jackson”的bean,因此将Spring bean设置为使用该名称将使Camel欺骗而不创建一个新的bean,而是使用我的。
  • 必须将Bean作用域设置为,SCOPE_PROTOTYPE因为REST DSL希望获得的新实例DataFormat。请参阅CAMEL-7880
2020-05-30