#java #spring #spring-boot #spring-cloud-stream
#java #весна #spring-boot #spring-cloud-stream
Вопрос:
Я нахожусь в проекте, где мы используем SpringBoot с Java (1.8 LTS) и Kafka через Spring Cloud Stream. Я получаю событие через облачный поток, который я сохраняю в MongoDB.
Мой StreamListener
выглядит так:
@StreamListener(MessagingChannels.BLA_CHANNEL)
public void onIncomingEvent(
EventContent eventContent,
@Header(name = uuid) UUID messageId
) {
doStuffWith(eventContent);
}
EventContent
выглядит так:
@ToString
@AllArgsConstructor
@Getter
@JsonNaming
public class EventContent {
private final String dataString1;
private final String dataString2;
...
private final Object details;
}
Моя проблема в том, что объект details может меняться, у производителя могут быть другие пары ключ / значение.
Некоторые производители отправляют свои данные в snake_case, но я хочу последовательно сохранять их в camelCase.
Так @JsonNaming
же как и этот тихий хороший, но, к сожалению, не транзитивный для деталей объект.
Здесь важно быть отказоустойчивым, поэтому, если здесь что-то сломается, это должно быть отправлено в DLQ.
Кто-нибудь знает, как я это делаю? Может быть, есть простой способ с одной аннотацией spring magic, я не знаю — новичок в spring 🙂
Большое спасибо!!
Ответ №1:
Вы должны настроить два разных ObjectMapper: один для Kafka с помощью ObjectMapper.setPropertyNamingStrategy(PropertyNamingStrategy .SNAKE_CASE) и другой для MongoDB без этой опции.