Spring 集成:Json 带蛇形外壳的变压器

Spring Integration: Json transformer with snake case

我正在使用 Spring 集成 + Spring Cloud Stream 创建以下流程:

@Bean
public IntegrationFlow testEventFlow(){
    return IntegrationFlows.from(TestEventSink.INPUT)
        .transform(Transformers.fromJson(TestEvent.class))
        .transform(TestEvent::getSomeId)
        .log()
        .channel("nullChannel")
        .get();
}

测试事件class是:

public class TestEvent {

  private String someId;

  public TestEvent(){}

  public TestEvent(String someId){
      this.someId = someId;
  }

  public String getSomeId(){
      return someId;
  }

  public void setSomeId(String someId){
      this.someId = someId;
  }
}

这里的问题是来自 TestEventSink.INPUT 的消息是蛇形的:

{ "some_id" : "1234" }

如果我用 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 注释测试事件 class 它运行良好,但我无法注释 class 因为它来自第三方库。

我试过设置 属性 spring.jackson.property-naming-strategy=SNAKE_CASE,但也没用。

我也试过:

@Bean
public ObjectMapper objectMapper(){
    ObjectMapper mapper = new ObjectMapper();
    mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
    return mapper;
}

但是没有用。

我认为我可以为该转换使用自定义映射器,但我正在寻找可以同时更改所有 Spring 集成 JSON 转换器配置的东西。

提前致谢!

您错过了将 Spring 引导 ObjectMapper 自动配置注入 fromJson() 工厂的事实:

. transform(Transformers.fromJson(TestEvent.class), 
       new Jackson2JsonObjectMapper(objectMapper))

重点是 Spring 集成在 Spring 引导之前进行,但反之亦然,因此自动配置在 Spring 集成中是不可见的。