Hi Till,
I just double checked the mapping below and it works properly for me. As
I mentioned, that will only fix it with a mapping file...default
introspection will need some code changes.
--Keith
Keith Visco wrote:
>
> Hi Till,
>
> Thanks for detailed description...I know it's ugly but you can try the
> following:
>
> <field name="..." type="org.exolab.castor.mapping.MapItem"
> collection="map">
> <bind-xml>
> <class name="org.exolab.castor.mapping.MapItem">
> <field name="key" type="string"/>
> <field name="value" type="string" collection="array"/>
> </class>
> </bind-xml>
> </field>
>
> I haven't tried this yet, I'll try it in a few moments to make sure it
> works...if not i'll try to come up with a workaround.
>
> Obviously that won't work for default introspection. In that case, I
> think what needs to happen is that the MapItem should "wrap" the items
> of the array (or any collection) in a mutlivalued container so that the
> output looks something like the following:
>
> <key>....</key>
> <value>
> <array-item>value1</array-item>
> <array-item>value2</array-item>
> </value>
>
> --Keith
>
> [EMAIL PROTECTED] wrote:
> >
> > Hi out there (especially Keith ;-) )
> >
> > This mail kind of refers to a previous thread (Subject "java.util.Map
> > support") where I described my problems unmarshalling the XML
> > representation of a HashMap generated by castors default mapping. But
> > since this starts the discussion about fixing that bug I decided to
> > start a new thread.
> >
> > I decided to dig into the sources of castor to find out, what goes
> > wrong during unmarshalling a HashMap (see thread mentioned above). My
> > starting point was the handling of a HashMap without a special mapping
> > file, since in my opinion It would be best for castor to be able to
> > marshall and unmarshall HashMaps containing keys and values of any
> > type, without having to specify a special mapping.
> >
> > Here is my assumption, why unmarshalling doesn't work:
> > When not defining a custom mapping in a mapping file, castor's
> > Introspector generates XMLClassDescriptor and XMLFieldDescriptor for
> > the classes and their fields (In
> > Introspector.generateClassDescriptor()) which have to be marshalled.
> > From now on, I will refer to the "_value" field of MapItem to
> > describe, what I think goes wrong. In my case the generation of the
> > field descriptor for MapItem's _value field messes up the
> > unmarshalling process. The getValue method of MapItem returns an
> > object of type java.lang.Object. The
> > Introspector.isCollection(java.lang.Object) call evalulates to false
> > and the "_multivalued" flag of the field descriptor is being set to
> > false as well. This causes the unmarshaller to throw a
> > ValidationException in Unmarshaller.endElement(String) : 836, when it
> > encounters more than one "value" elements in the XML.
> > So, that's what I think where the error is.
> > But I have no idea how to fix this. In my opinion the FieldDescriptor
> > has to be generated depending on how the XML looks, which has to be
> > unmarshalled.
> > In my case: when there is more than one value element, the field
> > descriptor must describe this field as multivalued and an array has to
> > be built. I also used my sweet eclipse debugger to just switch the
> > _multivalued flag to true. The effect was, that the unmarhsalled
> > hashmap did not contian an array, but the last value element in my XML
> > appeared as the only value in my HashMap element. Well, at least
> > unmarshalling finished without throwing an exception ;-)
> >
> > If anybody has an idea how to fix this, I would really appreciate it,
> > if you could tell me. My boss wants me to have this working the day
> > after tomorrow :-)
> >
> > kind regards,
> > Till Kothe
>
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
> unsubscribe castor-dev
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev