Почему значение autoDiscoverObjectMapper по умолчанию равно false в camel-jackson-starter?

#java #apache-camel #spring-camel #camel-jackson

#java #apache-camel #spring-camel #camel-jackson

Вопрос:

В настоящее время мы переносим наши приложения с Camel 2.x на Camel 3.x и столкнулись с проблемой, которая JacksonDataFormat больше не использует ObjectMapper из контекста приложения по умолчанию. Вместо этого вам нужно предоставить свойство camel.dataformat.json-jackson.auto-discover-object-mapper=true , чтобы эта функция работала. Я не понимаю, почему это не равно true по умолчанию для camel-jackson-starter модуля, мне это кажется нелогичным. Возможно, кто-то знает причину этого?

Ответ №1:

Apache Camel изменяет ObjectMapper свойства компонента в зависимости от вашего JacksonDataFormat определения. Это действительно сбивает с толку, если кажущееся нерелевантным DataFormat определение изменяет ваш одноэлементный ObjectMapper компонент в реестре, который вы, возможно, настроили для другой части вашего приложения. Это может быть неожиданным для некоторых разработчиков, поэтому было решено выполнить сбой во время запуска.

Если вы используете более одного JacksonDataFormat определения, никогда не устанавливайте camel.dataformat.json-jackson.auto-discover-object-mapper=true . Вы увидите некоторое странное поведение, которое будет чрезвычайно сложно отладить.

Смотрите CAMEL-14101:

Текущее поведение формата данных json-jackson по умолчанию заключается в попытке поиска экземпляра ObjectMapper в реестре и, если он не найден, для создания нового. В случае обнаружения одного экземпляра data format экземпляр data format настраивает его в соответствии со своими локальными свойствами, но поскольку один и тот же экземпляр ObjectMapper может использоваться совместно с различными форматами данных json-jackson, это может привести к несоответствиям или непредсказуемому поведению.

Комментарии:

1. Спасибо. Это полностью имеет смысл!

2. @Bedla, спасибо за ответ. Мы также заметили, что когда автоматическое обнаружение отключено, ObjectMapper по умолчанию не обнаруживает модули Jackson в classpath, т.Е. findAndRegisterModules(). Разрешено указывать их только вручную, каков наилучший способ сделать это?