If you don't want the FieldHandler#getValue to be called, disable
validation.

myUnmarshaller.setValidation(false);

--Keith

"Avadhanula, Suresh" wrote:
> 
> Hi,
> I have a FieldHandler for storing values of an HashMap to a file. I
> worked without any problems in Castor-0.9.3.19 which was the latest
> version when I wrote the FieldHandler.
> I have upgraded castor to 0.9.4 and FieldHandler throws a NPE.I debugged
> the code and looks like Unmarshal code calls Validate, which in turn
> call FieldHandlerImpl.getValue().
> I never expected FieldHandler's getValue() to be called while
> Unmarshalling XML to Object.
> 
> Here is the trace for the Exception
> 
> java.lang.NullPointerException
>         at
> com.dorado.is.persist.castor.TxnNamedObjectsHandler.getValue(TxnNamed
> ObjectsHandler.java:71)
>         at
> org.exolab.castor.mapping.loader.FieldHandlerImpl.getValue(Unknown So
> urce)
>         at org.exolab.castor.xml.FieldValidator.validate(Unknown Source)
>         at
> org.exolab.castor.xml.util.XMLClassDescriptorImpl.validate(Unknown So
> urce)
>         at org.exolab.castor.xml.Validator.validate(Unknown Source)
>         at org.exolab.castor.xml.UnmarshalHandler.endElement(Unknown
> Source)
>         at
> org.apache.xerces.parsers.AbstractSAXParser.endElement(AbstractSAXPar
> ser.java:552)
>         at
> org.apache.xerces.impl.XMLNamespaceBinder.endElement(XMLNamespaceBind
> er.java:646)
>         at
> org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDVal
> idator.java:2978)
>         at
> org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator
> .java:918)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.handleEndElemen
> t(XMLDocumentFragmentScannerImpl.java:1145)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(
> XMLDocumentFragmentScannerImpl.java:988)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent
> Dispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1446)
>         at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XM
> LDocumentFragmentScannerImpl.java:333)
>         at
> org.apache.xerces.parsers.StandardParserConfiguration.parse(StandardP
> arserConfiguration.java:529)
>         at
> org.apache.xerces.parsers.StandardParserConfiguration.parse(StandardP
> arserConfiguration.java:585)
>         at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:147)
>         at
> org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.j
> ava:1148)
>         at org.exolab.castor.xml.Unmarshaller.unmarshal(Unknown Source)
>         at org.exolab.castor.xml.Unmarshaller.unmarshal(Unknown Source)
> 
> 
> I get NPE as  I access the Objects's member in getValue() which is not
> yet set during Unmarshalling.
> 
> Here is a small use case scenario that I am running into.
> 
> public class SomClass
>         implements FieldHandler
> 
> {
> 
>     public Object getValue( Object object )
>         throws IllegalStateException
>     {
> 
>       SampleObject sb = (SampleObject)object;
>       String valueToStore = sb.getValueToStore();
>       String fileToStoreIn = sb.getFileName(); // This is set after the
> object is created.
>       storeInFile(fileToStoreIn, valueToStore); // NOT IMPLEMENTED IN
> THIS CLASS
>       return fileToStoreIn;
> 
>     }
> 
> 
> 
>     public void setValue( Object object, Object value )
>         throws IllegalStateException, IllegalArgumentException
>     {
>       String st = readFromFile((String)value);  // NOT IMPLEMENTED IN
> THIS CLASS
>       (SampleObject)object.setValueToStore(st);
>     }
> 
>     public void resetValue( Object object )
>         throws IllegalStateException, IllegalArgumentException
>     {
>         //-- add reset code here
>     }
> 
>     /**
>      * @deprecated No longer supported
>      */
>     public void checkValidity( Object object )
>         throws ValidityException, IllegalStateException
>     {
>         //-- add validation check if desired
>     }
> 
>     public Object newInstance( Object parent )
>         throws IllegalStateException
>     {
>       return new String();
>     }
> }
> 
> I get NPE in the above case because validate calls  SomeClass.getValue()
> where sb.getFileName() throw exception as it not yet set. This happens
> during Unmarshalling.
> 
> What is the RIGHT way to solve this problem?
> Why has the behaviour changed in Castor 0.9.4
> 
> I appreciate any response or help.
> 
> Thanks
> Suresh
> 
> -----------------------------------------------------------
> 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