I have a problem using Castor, i use 0.9.6.
The problem arises, when i try to marshal a HashMap which contains a
LinkedList. But occurs for all other combinations, that I've tried.
What am I doing wrong?
I will appreciate your input on how to solve the problem.
The following program reproduces the error:
--------------------------------------------
package dk.acure.journal.test.castor;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.LinkedList;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
public class Main {
public static void main(String[] args) throws MarshalException,
ValidationException, IOException, MappingException {
HashMap map = new HashMap();
LinkedList list = new LinkedList();
list.add("First element");
list.add("Second element");
map.put("key",list);
ClassToSave object = new ClassToSave();
object.setMap(map);
String xml = getXMLFromData(object);
ClassToSave objectAfter = getDataFromXML(xml);
}
private static String getXMLFromData(ClassToSave data) throws
MarshalException, ValidationException, IOException, MappingException {
StringWriter writer = new StringWriter();
Marshaller marshaller = new Marshaller(writer);
marshaller.marshal(data);
String xml = writer.toString();
return xml;
}
private static ClassToSave getDataFromXML(String xml) throws
MarshalException, ValidationException, IOException, MappingException {
ClassToSave data = null;
Unmarshaller unMarshaller = new Unmarshaller(ClassToSave.class);
data = (ClassToSave) unMarshaller.unmarshal(new StringReader(xml));
return data;
}
}
----------------------------------------
package dk.acure.journal.test.castor;
import java.io.Serializable;
import java.util.HashMap;
public class ClassToSave implements Serializable {
HashMap map;
public ClassToSave() {
super();
}
public HashMap getMap() {
return map;
}
public void setMap(HashMap map) {
this.map = map;
}
}
------------------------------------------
Which produces the following stack-trace.
I have not used an mapping file in this example, but specifying a
mapping-file has not solved the problem.
element "value" occurs more than once. (parent class:
org.exolab.castor.mapping.MapItem)
location: /map/map/value{file: [not available]; line: 2; column: 352}
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:671)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:565)
at dk.acure.journal.test.castor.Main.getDataFromXML(Main.java:51)
at dk.acure.journal.test.castor.Main.main(Main.java:37)
Caused by: ValidationException: element "value" occurs more than once.
(parent class: org.exolab.castor.mapping.MapItem)
location: /map/map/value
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:951)
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1084)
at org.apache.xerces.parsers.SAXParser.endElement(SAXParser.java:1398)
at
org.apache.xerces.validators.common.XMLValidator.callEndElement(XMLValidator.java:837)
at
org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:1200)
at
org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:380)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:861)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:657)
... 3 more
Caused by: ValidationException: element "value" occurs more than once.
(parent class: org.exolab.castor.mapping.MapItem)
location: /map/map/value
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:951)
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1084)
at org.apache.xerces.parsers.SAXParser.endElement(SAXParser.java:1398)
at
org.apache.xerces.validators.common.XMLValidator.callEndElement(XMLValidator.java:837)
at
org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:1200)
at
org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:380)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:861)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:657)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:565)
at dk.acure.journal.test.castor.Main.getDataFromXML(Main.java:51)
at dk.acure.journal.test.castor.Main.main(Main.java:37)
Caused by: ValidationException: element "value" occurs more than once.
(parent class: org.exolab.castor.mapping.MapItem)
location: /map/map/value
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:951)
at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1084)
at org.apache.xerces.parsers.SAXParser.endElement(SAXParser.java:1398)
at
org.apache.xerces.validators.common.XMLValidator.callEndElement(XMLValidator.java:837)
at
org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:1200)
at
org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:380)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:861)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:657)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:565)
at dk.acure.journal.test.castor.Main.getDataFromXML(Main.java:51)
at dk.acure.journal.test.castor.Main.main(Main.java:37)
Exception in thread "main"