Keith,

There is code to deal with base64 in UnmarshalHandler, but that is at the element level. There is no byte[] handling for the character content.

Thanks,
Pratibha

Keith Visco wrote:
Hi Pratibha,

There is already code in the UnmarshalHandler to deal with base64 and
byte[]'s. So if during unmarshalling it's not entering that block of
code then we need to figure out why.

I'll double check this later to see if I can duplicate the issue.

Thanks,

--Keith

Pratibha Gupta wrote:
  
I posted this message y'day, but did not see it on the list. Hence
posting it again. Apologise if the posting is duplicate.

I ran into some problems while trying to unmarshal DOM --> Java Object.

I had a complex type which had simple content that extended from
base64Binary.
i.e
<complexType name="SomeType">
   <simpleContent>
     <extension base="base64Binary">
     </extension>
   </simpleContent>
 </complexType>

<element name="SomeElement" type="SomeType"/>

The class generated for SomeType had this method
   public void setContent(byte[] content)
   {
       this._content = content;
   } //-- void setContent(byte)

When I tried to unmarshal a DOM to a Java object , I got a
ClassCastException. The problem was that in
castor/src/main/org/exolab/castor/xml/UnmarshalHandler.java,  the
content is converted to a String for ALL objects (even when the object
is actually a byte[])

Here is the code
          Object value = state.buffer.toString();
          if (isPrimitive(cdesc.getFieldType()))
           value = toPrimitiveObject(cdesc.getFieldType(), (String)value);

Thus, setContent was called with a String parameter instead of a byte[],
and that threw the class cast exception.

IMHO, the code should read
           Object value = state.buffer.toString();
               if (isPrimitive(cdesc.getFieldType())) {
                  value = toPrimitiveObject(cdesc.getFieldType(),
(String)value);
             }
              /* special handling for byte arrays */
             else {
               Class fieldType = cdesc.getFieldType();
               if ( (fieldType.isArray()) &&
(fieldType.getComponentType() == Byte.TYPE)) {
                 value = ((String)value).getBytes();
               } // end of if ()
             } // end of else
           I put in these changes and the unmarshalling worked fine for
my class. Has someone else faced the same problem? If yes, did u do
anything different?

Thanks,
Pratibha

-----------------------------------------------------------
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

----------------------------------------------------------- 
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

----------------------------------------------------------- 
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

  

Reply via email to