Интеграция Spring: преобразователь Json со змеиным корпусом

Я использую Spring Integration + Spring Cloud Stream для создания следующего потока:

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

Класс тестового события:

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" }

Если я аннотирую класс Test Event с помощью @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class), он работает хорошо, но я не могу аннотировать класс, потому что он из сторонней библиотеки.

Я попытался установить свойство spring.jackson.property-naming-strategy=SNAKE_CASE, но оно тоже не сработало.

Я также пробовал:

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

Но это не сработало.

Я думаю, что могу использовать пользовательский сопоставитель для этого преобразования, но я ищу что-то, что одновременно изменяет конфигурацию всех преобразователей Spring Integration JSON.

Заранее спасибо!

С PropertyNamingStrategy.SNAKE_CASE ваш ObjectMapper будет работать, если вы назовете его так: mapper.readValue(str, SomeClass.class); . где str — это json-as-string в виде змеи, а SomeClass — это сопоставление POJO с JSON.

raviiii1 07.04.2019 10:31
0
1
329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы упускаете возможность внедрить автоматически настроенный Spring Boot ObjectMapper в fromJson() factory:

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

Дело в том, что Spring Integration предшествует Spring Boot, а не наоборот, поэтому автоконфигурация не видна в Spring Integration как есть.

Итак, единственный способ - это собственный маппер в каждом вызове трансформатора.

italktothewind 07.04.2019 23:09

Другие вопросы по теме