2015-12-19 2 views
1

Я создаю приложение, которое будет содержать данные в XML-файле.JAXB Inheritance + XMLAdapter (HasMap)

Я застрял прямо сейчас с одной проблемой: JAXB не сортирует мой дочерний класс, поэтому, когда я umarshall XML-файл, все объекты являются объектами класса родителя. Я пробовал некоторые варианты с @XMLSeeAlso, AccessType.FIELD и JAXBContext jaxbContext = JAXBContext.newInstance(Important.class, Parent.class, Child.class); , но похоже, что я пропустил что-то, что-то не понял, и он не работает.

Не могли бы вы дать мне несколько советов? Какие аннотации следует использовать? или mb XMLAdapter? Нынешняя структура моего проекта (я пытался упростить):

Main.java

public class Main { 
    public static void main(String args[]){ 
     JAXB jaxb = new JAXB(); 
     Parent parent = new Parent(1); 
     Child child = new Child(2,3) 
     Important important = new Important(); 
     jaxb.write(important); 
    } 
} 

Important.java

@XmlRootElement(name="important") 
public class Important { 
public Map<Integer, Parent> hashMap; 
    //some code here 
} 

Parent.java

public class Parent{ 
    public int parentField; 
    //constructor 
} 

Child.java

public class Child extends Parent { 
    public int childField; 
    //constructors 
} 

И простой класс JAXB. JAXB.java

public class JAXB { 
    public void write(Important important) { 
     try { 
      JAXBContext jaxbContext = JAXBContext.newInstance(Important.class); 
      Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      jaxbMarshaller.marshal(important, System.out); 

     } catch (JAXBException e) { 
      System.err.println(e + "Error."); 
     } 
    } 
} 

Но после того, как сортировочная возвращает XML, который не содержит никакой информации о ребенке.

<important> 
    <hashMap> 
     <entry> 
      <key>0</key> 
      <value> 
       <parentField>1</parentField> 
      </value> 
     </entry> 
     <entry> 
      <key>0</key> 
      <value> 
       <parentField>2</parentField> 
      </value> 
     </entry> 
    </hashMap> 

, а затем закрывающий тег.

Моя карта 100% содержит различные типы классов: родитель и ребенок

Любые мысли?

ответ

0

Аннотации @XmlSeeAlso позволяют JAXBContext знать о ваших подклассах.

Добавление @XmlSeeAlso(Child.class) к вашему классу Parent должно сделать трюк.

Для справки см. Также принятый ответ для Using JAXB to pass subclass instances as superclass.

Предлагаемое решение

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlSeeAlso(Child.class) 
public class Parent { 

    public int parentField; 

    public Parent(Integer parentField) { 
     this.parentField = parentField; 
    } 
} 

Результаты для меня в

<important> 
    <map> 
     <entry> 
      <key>0</key> 
      <value> 
       <parentField>1</parentField> 
      </value> 
     </entry> 
     <entry> 
      <key>1</key> 
      <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="child"> 
       <parentField>2</parentField> 
       <childField>3</childField> 
      </value> 
     </entry> 
    </map> 
</important> 
+0

WTF ... это работает. Я не знаю, что я сделал раньше, но теперь он работает – Ivan

+0

Кстати, я удалил аннотацию @XMLAccessorType из-за некоторых проблем – Ivan