2013-04-12 4 views
2

Хорошо вот что происходит, когда я делаю следующее:@XmlJavaTypeAdapter, наследственный и XSI: Тип

Entities.java: Все из этих классов, чьи имена начинаются с «E» (например, EStudent, Ривка Ферштман и т.д.) продолжается EntityWithId класс.

public class Entities { 

    Map<Integer,EStudent> students; 
    Map<Integer,ETeacher> teachers; 
    Map<Integer,ECourse> courses; 
    Map<Integer,EQuiz> quizzes; 
    Map<Integer,EQuestion> questions; 
    Map<Integer,EAnswer> answers; 
    Map<Integer,ETimeslot> timeslots; 
    Map<Integer,ESharedFile> sharedFiles; 

    ... 
} 

объекты в XML-bindings.xml: Я поставил XML-Java-тип-адаптер для всех свойств. Опущено для ясности.

<?xml version="1.0" encoding="US-ASCII"?> 
    <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="com.pest.esinif.common.entity"> 

<java-types> 
    <java-type name="Entities"> 
     <java-attributes> 
      <xml-element java-attribute="students" > 
       <xml-java-type-adapter value="com.pest.esinif.common.entity.adapters.MapToCollectionAdapter" /> 
      </xml-element> 
      ... 
     </java-attributes> 
    </java-type> 
</java-types> 
</xml-bindings> 

MapToCollectionAdapter.java: Предназначен для преобразования карт в коллекции.

public class MapToCollectionAdapter extends XmlAdapter<MyCollection, Map<Integer,EntityWithId>> { 

@Override 
public Map<Integer, EntityWithId> unmarshal(MyCollection v) throws Exception { 
    Map<Integer, EntityWithId> m = new TreeMap<>(); 

    for (Iterator<EntityWithId> it = v.list.iterator(); it.hasNext();) { 
     EntityWithId i = it.next(); 
     m.put(i.getId(), i); 
    } 

    return m; 
} 

@Override 
public MyCollection marshal(Map<Integer, EntityWithId> v) throws Exception { 
    if(v == null) { 
     return null; 
    } 
    MyCollection mc = new MyCollection(); 
    mc.list = v.values(); 
    return mc; 
} 

class MyCollection { 

    @XmlElement(name="entry") 
    public Collection<EntityWithId> list; 

    public MyCollection() {} 
} 

Когда я делаю это, выходите так, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<entities> 
    <courses> 
     <entry id="4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="eCourse"> 
     <name>English</name> 
     <timetable>5</timetable> 
     <timetable>6</timetable> 
     </entry> 
    </courses> 
    <students> 
     <entry id="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="eStudent"> 
     <name>Anil Anar</name> 
     </entry> 
    </students> 
    <timeslots> 
     <entry id="12" course="4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="eTimeslot"> 
     <attendances>1</attendances> 
     <day>1970-01-01T02:00:00.0</day> 
     <slot>0</slot> 
     </entry> 
    </timeslots> 
</entities> 

Вы заметили этих xsi:type s? Когда я их опускаю, очевидно, что неудачник. Но я не хочу, чтобы все теги <entry> имели это. Я бы предпочел бы это следующим образом:

<courses child-xsi-type="eCourse"> 
    <entry> ... </entry> 
    <entry> ... </entry> 
</courses> 

Спасибо за помощь.

+0

Этот вопрос кажется, что его отношение к шахте, но его ответ не достаточно ясно: http://stackoverflow.com/questions/8912925/jaxb-elipselink-xmljavatypeadapter и-The-тип атрибут? RQ = 1 – mostruash

ответ

0

Я решил проблему благодаря Blaise Doughan's blogs. Фокус в том, чтобы использовать @XmlAnyElement(lax=true) и должен аннотировать дочерние классы EntityWithId с @XmlRootElement.

class MyCollection { 

    @XmlAnyElement(lax=true) 
    public Collection<EntityWithId> list; 

    public MyCollection() {} 
} 

выход я получаю:

<?xml version="1.0" encoding="UTF-8"?> 
<entities> 
    <courses> 
     <course id="4"> 
     <name>English</name> 
     <timetable>5</timetable> 
     <timetable>6</timetable> 
     </course> 
    </courses> 
    <students> 
     <student id="1"> 
     <name>Anil Anar</name> 
     </student> 
    </students> 
    <timeslots> 
     <timeslot id="12"> 
     <attendances>1</attendances> 
     <day>1970-01-01T02:00:00.0</day> 
     <slot>0</slot> 
     </timeslot> 
    </timeslots> 
</entities> 
Смежные вопросы