Как сопоставить тип объекта в JAXB

#json #object #jaxb #adapter #jackson

#json #объект #jaxb #адаптер #джексон

Вопрос:

Существует множество примеров того, как отображать в JAXB с использованием XmlTypeAdapters, и это здорово.

Однако моя ситуация такова, что у меня есть поле, которое может иметь любой тип (т. Е.: Object.class в Java). Я хочу использовать адаптер, который в основном передает мне все управление для сортировки / отмены сортировки для этого поля. Опять же, я не знаю входящий тип, и я не знаю исходящий тип, кроме как во время выполнения.

Например:

 @XmlRootElement( name="myType" )
@XmlAccessorType(XmlAccessType.FIELD)
class MyType {
   @XmlElement("value")
   @XmlJavaTypeAdapter(ValueAdapter.class)
   private Object value;

   public static class ValueAdapter extends XmlAdapter<Object, Object> {

       public ValueAdapter() {

       }

       public Object marshal(Object value) {
           if (value instanceof Date) {
               // do date stuff
           }
           else if (value instanceof Foo) {
               // do foo stuff
           }
           // ... etc ...
           else {
               return value;
           }
       }

       public Object unmarshal(Object value) {
           if (value instanceof Date) {
               // do date stuff
           }
           else if (value instanceof Foo) {
               // do foo stuff
           }
           // ... etc ...
           else {
               return value;
           }
       }
    }

    // getter/setter fluff ...

}
  

Однако при использовании Jackson ValueAdapter не вызывается.

Это правильный способ сделать это в JAXB? Если нет, то как это сделать?

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

1. Гааа! 1 очко для меня. Я не видел, чтобы в адаптере были достигнуты точки останова. После очистки моего проекта в моей IDE точки останова достигаются, как и ожидалось, и вышеуказанные решения работают. Я надеюсь, что это кому-то поможет.

Ответ №1:

Рад, что это работает. Теперь, поскольку вы используете Jackson, также может быть полностью автоматизированный способ.

В частности, для полиморфных типов вы часто можете получить надлежащую обработку с помощью @JsonTypeInfo аннотации — она добавит информацию о типе при сериализации, используйте это при десериализации. И пока у реальных конкретных типов есть обработчики (стандартные типы JDK, beans, коллекции других обрабатываемых типов), это все, что вам нужно.