#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(). Разрешено указывать их только вручную, каков наилучший способ сделать это?