Я использую 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.
Заранее спасибо!
Вы упускаете возможность внедрить автоматически настроенный Spring Boot ObjectMapper в fromJson() factory:
. transform(Transformers.fromJson(TestEvent.class),
new Jackson2JsonObjectMapper(objectMapper))
Дело в том, что Spring Integration предшествует Spring Boot, а не наоборот, поэтому автоконфигурация не видна в Spring Integration как есть.
Итак, единственный способ - это собственный маппер в каждом вызове трансформатора.
С
PropertyNamingStrategy.SNAKE_CASEваш ObjectMapper будет работать, если вы назовете его так:mapper.readValue(str, SomeClass.class);. где str — это json-as-string в виде змеи, а SomeClass — это сопоставление POJO с JSON.