Как отобразить тип объекта в JAXB - PullRequest
1 голос
/ 10 ноября 2011

Существует множество примеров того, как отобразить в 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 ...

}

Однако, используя Джексона, ValueAdapter не вызывается.

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

1 Ответ

0 голосов
/ 10 ноября 2011

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

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

...