Пользовательский десериализатор Json Apache Camel Rest

Я использую Camel 2.16.0 для проекта Camel Rest. Я представил абстрактный тип, для обработки которого мне нужен собственный десериализатор. Это работает, как и ожидалось, в моих модульных тестах десериализации, где я регистрирую свой пользовательский десериализатор в Objectmapper для тестов. Насколько я понимаю, можно также зарегистрировать пользовательские модули в Jackson Objectmapper, используемом Camel (верблюд json).

Моя конфигурация:

...
<camelContext id="formsContext" xmlns="http://camel.apache.org/schema/spring">
  ...
  <dataFormats>
    <json id="json" library="Jackson" useList="true" unmarshalTypeName="myPackage.model.CustomDeserialized" moduleClassNames="myPackage.MyModule" />      
  </dataFormats>
</camelContext>

Мой модуль:

package myPackage;

import com.fasterxml.jackson.databind.module.SimpleModule;

public class MyModule extends SimpleModule {

  public MyModule() {
    super();
    addDeserializer(CustomDeserialized.class, new MyDeserializer());
  }

}

Конфигурация верблюжьего отдыха:

restConfiguration()
.component("servlet")
.bindingMode(RestBindingMode.json)
.dataFormatProperty("prettyPrint", "true")
.contextPath("/")
.port(8080)
.jsonDataFormat("json");

При запуске службы и вызове функции, использующей средство сопоставления объектов, я получаю исключение:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of myPackage.model.CustomDeserialized, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

Любые предложения о том, что не так с моей настройкой?


person Lynge    schedule 21.11.2018    source источник
comment
Я использовал внешнюю библиотеку, чтобы добавить поддержку hal+json в свой тестовый проект. В основном я определяю свой собственная версия DefaultDataFormatResolver и зарегистрируйте ее в верблюжий контекст.   -  person Roman Vottner    schedule 23.11.2018
comment
В остальная конфигурация Тогда я смог добавить пользовательский формат данных. Не уверен, что это именно то, о чем вы просите. Это также работает только для подхода «все или ничего». Если вам нужен только один маршрут для поддержки этой функции, это, вероятно, не правильный подход, к сожалению.   -  person Roman Vottner    schedule 23.11.2018


Ответы (1)


Я нашел это решение проблемы и использовал эту реализацию для моего пользовательского формата данных Джексона:

public class JacksonDataFormatExtension extends JacksonDataFormat {

  public JacksonDataFormatExtension() {
    super(CustomDeserialized.class);
  }

  protected void doStart() throws Exception {
    addModule(new MyModule());
    super.doStart();
  }
}
person Lynge    schedule 23.11.2018
comment
Пожалуйста, не редактируйте свое решение в исходном сообщении, а добавьте его к своему ответу. Вы можете самостоятельно ответить на вопрос здесь, на SO, без каких-либо соображений. Пожалуйста, также примите ваш ответ как можно скорее, чтобы помочь другим в будущем легче решить подобную проблему :) - person Roman Vottner; 23.11.2018