| Subcribe via RSS

ConversionException when parsing XML with XStream: Element is not defined

May 27th, 2009 | No Comments | Posted in Software Development

XStream is an easy to use Java library to serialize objects to XML and back again. Yesterday I wanted to parse a XML document generated by a third party software with the following structure:

<?xml version="1.0" encoding="UTF-8"?>
<AuditTrail>
    <Entry type="ExecutionReport" msgId="2544804979">
        <field tag="35" val="8"/>
        <field tag="34" val="000023"/>
        <field tag="43" val="N"/>
        <field tag="52" val="20090526-20:08:31"/>
        <field tag="6556" val="today12"/>
        <field tag="17" val="73740.1243368511.0"/>
        <field tag="32" val="*"/>
    </Entry>
    <Entry type="Acknowledged" msgId="1540251818">
    </Entry>
</AuditTrail>

I created three classes AuditTrail, AuditTrailEntry and AuditTrailEntryField for the elements AuditTrail, Entry, and field, respectively. In addition, I set the aliases accordingly:

XStream xStream = new XStream ();
xStream.alias ("AuditTrail", AuditTrail.class);
xStream.alias ("Entry", AuditTrailEntry.class);
xStream.alias ("field", AuditTrailEntryField.class);

A call to the method fromXml() of the XStream object resulted in the following exception:

ConversionException: Element [NAME] of type [TYPE]
                     is not defined as [NAME] in type [TYPE]

Because I did not find a quick solution via a Google search I was forced to read the XStream documentation. ;-) There I learned something about Implicit Collections in XStream. Whenever you have a collection which does not display it’s root tag, you can map it as an implicit collection:

xStream.addImplicitCollection (AuditTrailEntry.class, "fields");
xStream.addImplicitCollection (AuditTrail.class, "entries");

with

private List <AuditTrailEntryField> fields;

in class AuditTrailEntry and

private List <AuditTrailEntry> entries;

in class AuditTrail.

Tags: , ,

XPP3 pull-parser causing an ArrayIndexOutOfBoundsException: Google GWT with Eclipse, Maven and Hibernate

October 17th, 2008 | No Comments | Posted in Software Development

Today I lost almost two hours of productive work because I had problems compiling a simple Google GWT application. For software development I use Eclipse 3.4 (Ganymede) with the Maven Integration plugin. In case of GWT I also use the Cypal Studio.

My GWT application makes RPCs to a server backed by Hibernate. Including Hibernate (org.hibernate:hibernate-core-3.3.1.GA from the JBoss repository) into the classpath via Maven also includes XPP3 and the pull-parser-2 libraries. Then for some reason the Google GWT compiler uses the pull-parser-2 to parse the XML of the inherited modules.

The module com.google.gwt.user.User includes the module com.google.gwt.i18n.I18N which causes an ArrayIndexOutOfBoundsException:

[ERROR] Line 29: Unexpected exception while processing element 'inherits'
java.lang.ArrayIndexOutOfBoundsException: null
    at java.lang.System.arraycopy(Native Method)
    at org.gjt.xpp.impl.tokenizer.Tokenizer.next(Tokenizer.java:1274)
    at org.gjt.xpp.impl.pullparser.PullParser.next(PullParser.java:392)
    at org.gjt.xpp.sax2.Driver.parseSubTree(Driver.java:415)
    at org.gjt.xpp.sax2.Driver.parse(Driver.java:310)
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.parse(ReflectiveParser.java:310)

This seems to be a bug in the pull-parser-2. Excluding the pull-parser from the hibernate-core dependency removes it from the class path, but the GWT compiler continues using it for parsing its XML modules. The solution was to include the pull-parser-2.1.10 in the Java Build Path of Eclipse and put it to the first position in the build class path order in Eclipse.

Tags: , , , , ,