Хорошо вот что происходит, когда я делаю следующее:@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>
Спасибо за помощь.
Этот вопрос кажется, что его отношение к шахте, но его ответ не достаточно ясно: http://stackoverflow.com/questions/8912925/jaxb-elipselink-xmljavatypeadapter и-The-тип атрибут? RQ = 1 – mostruash