@XmlRootElement(name = "bookingSystem")
public class BookingSystem {
@XmlJavaTypeAdapter(StringMapAdapter.class)
private Map<String, HashMap<String, PriorityQueue<DateTime>>> takerMap
= new HashMap<String, HashMap<String, PriorityQueue<DateTime>>>();
...
适配器:
public class StringMapAdapter
extends XmlAdapter<StringMapConverter, Map<String, StringPQueueMap>> {
@Override
public StringMapConverter marshal(Map<String, StringPQueueMap> mapToConvert) throws Exception {
StringMapConverter myMapType = new StringMapConverter();
for (Entry<String, StringPQueueMap> entry : mapToConvert.entrySet()) {
StringMap myMapEntryType = new StringMap();
myMapEntryType.key = entry.getKey();
myMapEntryType.value = (Map<String, StringPQueueMap>) entry.getValue();
// **Problem occurs here**
myMapType.entry.add(myMapEntryType);
}
return myMapType;
}
出现在myMapType.entry.add(myMapEntryType);
中的问题
其中的StringPQueueMap是以下内容:
public class StringPQueueMap {
@XmlAttribute
public String key;
@XmlElement(name = "StringPQueueMapObject")
public PriorityQueue<DateTime> value;
}
,对于这两个映射,我的转换器类看起来都相同,但名称为StringMap或StringPQueueMap
@XmlElementWrapper(name = "bookingMapWrapper")
public List<StringMap> entry =
new ArrayList<StringMap>();
public List<StringMap> getMyMapType() {
return this.entry;
}
,这引发了以下异常: javax.xml.bind.MarshalException -具有链接的例外: [com.sun.istack.internal.SAXException2:类java.util.PriorityQueue或其任何超类对此上下文都是已知的。 javax.xml.bind.JAXBException:此上下文已知类java.util.PriorityQueue或其任何超类。 在com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311) 在com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236) 在javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:103)
一般来说,我对使用JAXB和XML文件没有任何经验,只要我到目前为止映射了一些地图,我就设法设法解决了所有问题,但这似乎并不适用PriorityQueue。我怀疑DateTime对象(jodatime库)也可能是这种情况,如果我认为它们不是问题的起因或至少不是问题的一部分。有人可以提供有关如何解决此问题的建议吗,我的目标是将这个相当复杂的自定义对象编组为XML文件,以后再将其解组(尽管我相信如果设法使编组工作正常,我就可以弄清楚该编组问题。 )。