さて、私が次のことをするとどうなりますか:
Entities.java: 名前が「E」で始まるクラス (EStudent、ETeacher など) はすべて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;
...
}
entities-xml-bindings.xml: すべてのプロパティに xml-java-type-adapter を設定しました。わかりやすくするために省略します。
<?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
か?それらを省略すると、unmarshaller は明らかに失敗します。<entry>
しかし、すべてのタグにそれを持たせたくありません。私は次のようにそれを好むでしょう:
<courses child-xsi-type="eCourse">
<entry> ... </entry>
<entry> ... </entry>
</courses>
手伝ってくれてありがとう。