Werner,
> Can I address this a little bit later ?
This shouldn't be hard to reproduce.
Just a simple schema with an dateTime element:
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="CreationDateAndTime" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Configure a handler in binding.xml:
<elementBinding name="/Root/CreationDateAndTime" >
<member name="CreationDateAndTime" handler="MyDateHandler"/>
</elementBinding>
And try to unmarshall an xml document like:
<Root ....>
<CreationDateAndTime>2010-03-1T09:57:01+01:00</CreationDateAndTime>
</Root >
The handler is never called as an exception is thrown.
Question:
How can I get a date like '2010-03-1T09:57:01+01:00' into a date field?
Greetings,
Huub
On 10.03.2010 11:48, [email protected] wrote:
> Werner,
>
> Thanks for your reply.
> a binding file makes sense to me.
Great.
> Although I do not quite understand why it is not possible with a mapping
> file.
> Is it not possible to mix generated descriptors and a mapping?
Well, it is, but probably not at this level. It is possible, to my
understanding, to override a complete class mapping, but in this case
you are trying something very fine-granular.
> Anyway, I tried it with a binding file.
Which imho is the far better approach.
> But that leads to a problem which I will try to explain by showing my
> relevant configuration and code.
Can I address this a little bit later ?
>
> my binding file:
> <binding ...
> <elementBinding
> name="/complexType:DocumentIdentificationType/CreationDateAndTime"
> <member name="CreationDateAndTime"
> handler="some.package.SBDDateHandler"/
> </elementBinding
> </binding
> relevant part of my xsd:
> <xs:complexType name="DocumentIdentificationType"
> <xs:sequence
> ...
> <xs:element name="CreationDateAndTime" type="xs:dateTime"/
> </xs:sequence
> </xs:complexType
> The relevant generated code of DocumentIdentificationTypeDescriptor:
>
> //-- _creationDateAndTime
> desc = new
> org.exolab.castor.xml.util.XMLFieldDescriptorImpl(java.util.Date.class,
> "_creationDateAndTime", "CreationDateAndTime",
> org.exolab.castor.xml.NodeType.Element);
> desc.setImmutable(true);
> handler = new some.package.SBDDateHandler();
> //-- test for generalized field handler
> if (handler instanceof
> org.exolab.castor.mapping.GeneralizedFieldHandler)
> {
> //-- save reference to user-specified handler
> org.exolab.castor.mapping.GeneralizedFieldHandler gfh =
> (org.exolab.castor.mapping.GeneralizedFieldHandler) handler;
> handler = new org.exolab.castor.xml.XMLFieldHandler() {
> @Override
> public java.lang.Object getValue( java.lang.Object object )
> throws IllegalStateException
> {
> DocumentIdentificationType target =
> (DocumentIdentificationType) object;
> return target.getCreationDateAndTime();
> }
> @Override
> public void setValue( java.lang.Object object,
> java.lang.Object value)
> throws IllegalStateException, IllegalArgumentException
> {
> try {
> DocumentIdentificationType target =
> (DocumentIdentificationType) object;
> target.setCreationDateAndTime( (java.util.Date)
> value);
> } catch (java.lang.Exception ex) {
> throw new IllegalStateException(ex.toString());
> }
> }
> @Override
> @SuppressWarnings("unused")
> public java.lang.Object newInstance(java.lang.Object
> parent) {
> return null;
> }
> };
> gfh.setFieldHandler(handler);
> handler = gfh;
> }
> <<<<<<<<<<<<<<<<<<<<<
> When I unmarshall an XML document which contains
> ...
> <CreationDateAndTime2010-03-1T09:57:01+01:00</CreationDateAndTime
> ...
> An exception is thrown before my SBDDateHandler is called.
> Debugging some castor code leads to the following:
> At line 872 of UnmarshalHandler.java (castor-1.3)
> code: if (addObject) handler.setValue(state.object, value);
> At that point the handler is a DateFieldHandler which seems to handle the
> content of the element for a non primitiveorimmutable type?
> It calls:
> code: Date temp = Date.parseDate(value.toString()) ; (line 182 of
> DateDescriptor.java)
> This will throw an exception as my Date has an invalid value (day must
> have 2 digits).
> So the problem is that the Date field is parsed before my Date Handler
> gets a chance to parse it!!!?
> Now when I change the binding:
> <elementBinding
> name="/complexType:DocumentIdentificationType/CreationDateAndTime"
> <member name="CreationDateAndTime" java-type="java.lang.String"
> handler="some.package.SBDDateHandler"/
> </elementBinding
> It changes the generated descriptor:
> The relevant generated code of DocumentIdentificationTypeDescriptor:
>
> //-- _creationDateAndTime
> desc = new
> org.exolab.castor.xml.util.XMLFieldDescriptorImpl(java.lang.String.class,
> "_creationDateAndTime", "CreationDateAndTime",
> org.exolab.castor.xml.NodeType.Element);
> desc.setImmutable(true);
> handler = new some.package.SBDDateHandler();
> //-- test for generalized field handler
> if (handler instanceof
> org.exolab.castor.mapping.GeneralizedFieldHandler)
> {
> //-- save reference to user-specified handler
> org.exolab.castor.mapping.GeneralizedFieldHandler gfh =
> (org.exolab.castor.mapping.GeneralizedFieldHandler) handler;
> handler = new org.exolab.castor.xml.XMLFieldHandler() {
> @Override
> public java.lang.Object getValue( java.lang.Object object )
> throws IllegalStateException
> {
> DocumentIdentificationType target =
> (DocumentIdentificationType) object;
> return target.getCreationDateAndTime();
> }
> @Override
> public void setValue( java.lang.Object object,
> java.lang.Object value)
> throws IllegalStateException, IllegalArgumentException
> {
> try {
> DocumentIdentificationType target =
> (DocumentIdentificationType) object;
> target.setCreationDateAndTime( (java.lang.String)
> value);
> } catch (java.lang.Exception ex) {
> throw new IllegalStateException(ex.toString());
> }
> }
> @Override
> @SuppressWarnings("unused")
> public java.lang.Object newInstance(java.lang.Object
> parent) {
> return null;
> }
> };
> gfh.setFieldHandler(handler);
> handler = gfh;
> }
> <<<<<<<<<<<<<<<<<<<<<
> The problem in this case is that my DocumentIdentificationType does not
> contain a member creationDateAndTime of type String but of type Date.
> So how do I get a String into my SBDDateHandler and keep my
> creationDateAndTime a Date in DocumentIdentificationType ??
>
> Greetings,
> Huub
>
>