Hi Jeremy, Since it's part of the introspector, normally it shouldn't matter whether it's unmarshalling or marshaller. Try it with a non-date type. Date handling in Castor has some special test cases which might be getting in the way, in which case I'll need to obviously place priority on a user-specified handling.
--Keith Jeremy Haile wrote: > > Keith, > > Should the FieldHandlerFactory method also work for the Marshaller? When > I test it, the only method that gets called on my FieldHandlerFactory is > getSupportedTypes. Currently my getSupportedTypes is just: > > public Class[] getSupportedTypes() { > System.out.println( "getSupportedTypes()" ); > return new Class[] { GregorianCalendar.class } ; > } > > However, when I marshall the document, no other methods are called and I > still get output such as: > > "password-last-changed-ts="java.util.GregorianCalendar[time=10753234......." > > Any ideas? Will this be incorporated by the next release? I really like > the FieldHandlerFactory technique much better than specifying a handler > for each field in your mapping.. > > Jeremy > > On Wed, 28 Jan 2004 13:01:40 -0600, "Keith Visco" <[EMAIL PROTECTED]> > said: > > > > Hi Jeremy, > > > > I recall the discussion, though the problem obviously still exists if > > you are running into it. You might want to file a bug on that > > (http://bugzilla.exolab.org). > > > > There is an "undocumented" workaround for anyone using the CVS version, > > it's the ability to set a GeneralizedFieldHandler for a specific type > > and not only for a specific field: > > > > 1. Implement org.exolab.castor.mapping.FieldHandlerFactory > > > > This factory should return your GeneralizedFieldHandler for > > the InetAddress class. > > > > 2. Remove the GeneralizedFieldHandler reference from the mapping file. > > Leave the <field> mapping, just remove the handler="myHandler". > > > > 3. Set the FieldHandlerFactory in the introspector as such: > > > > import org.exolab.castor.xml.ClassDescriptorResolver; > > import org.exolab.castor.xml.Introspector; > > import org.exolab.castor.xml.util.ClassDescriptorResolverImpl; > > > > > > ClassDescriptorResolverImpl cdr = new ClassDescriptorResolverImpl(); > > cdr.getIntrospector().addFieldHandlerFactory(myFactory); > > > > 4. Now use this ClassDescriptorResolver in the Unmarshaller and > > Unmarshal: > > > > > > Unmarshaller unm = new Unmarshaller(...); > > unm.setResolver(cdr); > > Object root = unm.unmarshal(reader); > > > > Hope that helps, > > > > --Keith > > > > > > > > Jeremy Haile wrote: > > > > > > I'm new to the list, so I hope I'm not rehashing a question that has been > > > discussed recently. I looked in the mail archives and only found posts > > > up to March of last year discussing using GeneralizedFieldHandler with > > > Collections. It seems that the strange behavior when using a > > > GeneralizedFieldHandler with collections is still present. > > > > > > My needs are similar to those of the old "URL" post. In short, I am > > > trying to marshall and unmarshall a Set of java.net.InetAddress objects. > > > I want to marshall them into a java.lang.String via the > > > InetAddress.getHostName() method. My generalized field handler receives > > > an enumeration of InetAddress objects in convertUponGet() while > > > marshalling. I simply convert this to a set of java.lang.String objects > > > and return it. This works as expected. > > > > > > However, it is odd that when unmarshalling, convertUponSet() gets called > > > for each element in the collection instead of with an enumeration - fine, > > > I can deal with that. But why does convertUponGet() get called while I > > > am unmarshalling. Has this not been fixed in 0.9.5.2? How should I be > > > handling this situation? > > > > > > Relevant code is below. Note that my code fails during unmarshalling > > > when convertUponGet() is called. If I comment out my convertUponGet() my > > > code functions (I could probably develop a workaround), but I figured > > > that Castor should have a defined, working way of dealing with this > > > situation. > > > > > > Thanks! > > > > > > Running in Redhat Linux, JDK 1.4.2_03, Castor 0.9.5.2 > > > > > > -==MAPPING==- > > > > > > <field name="ipAddresses" > > > type="java.lang.String" > > > handler="com.company.module.support.InetAddressFieldHandler" > > > get-method="getIpAddresses" > > > set-method="setIpAddresses" > > > collection="set"> > > > <bind-xml name="ip-address" > > > node="element" /> > > > </field> > > > > > > -==FIELD HANDLER==- > > > /** > > > * Used for marshalling of a collection of InetAddresses by > > > converting them > > > * into a set of strings that represents their hostnames. > > > * <p> > > > * This method uses the [EMAIL PROTECTED] InetAddress#getHostAddress} method > > > to > > > * convert the InetAddress object into a string form. > > > * > > > * @param o the InetAddress object to convert > > > * > > > * @return a String encoding of the InetAddress object > > > */ > > > public Object convertUponGet(Object o) { > > > > > > if( o == null ) > > > return null; > > > > > > // Create new set to hold ip addresses that are marshalled > > > Set addressSet = new HashSet(); > > > > > > // Loop through each value given by castor and convert to a > > > string. > > > // The string will be stored in the new set and returned to > > > castor > > > // to be marshalled in the XML file. > > > Enumeration enum = (Enumeration) o; > > > while ( enum.hasMoreElements() ) { > > > InetAddress address = (InetAddress)enum.nextElement(); > > > > > > // Add address host name to the address collection > > > addressSet.add( address.getHostName() ); > > > } > > > > > > return addressSet; > > > } > > > > > > /** > > > * Unmarshalls a set of String IP Addresses into a set of InetAddress > > > * objects. > > > * <p> > > > * The IP address is expected to be formatted in a way accepted by > > > * [EMAIL PROTECTED] InetAddress#getByName(String)}. > > > * > > > * > > > * @param o the String encoding of a InetAddress object > > > * > > > * @return the newly create java.util.InetAddress object > > > */ > > > public Object convertUponSet(Object o) { > > > > > > if( o == null ) > > > return null; > > > > > > String hostName = (String) o; > > > InetAddress inetAddress = null; > > > > > > try { > > > > > > // convert string into an inet address object > > > inetAddress = InetAddress.getByName( hostName ); > > > > > > } catch (UnknownHostException e) { > > > > > > // Castor doesn't allow us to throw exceptions in this class, > > > so > > > // a runtime exception is thrown as this is a fatal error... > > > //todo Create a more elegant error reporting mechanism for > > > field support > > > throw new RuntimeException( "Host name is not a legal value: > > > '" + hostName + "'" ); > > > } > > > > > > return inetAddress; > > > } > > > > > > -- > > > Jeremy Haile > > > [EMAIL PROTECTED] > > > > > > > ----------------------------------------------------------- > > If you wish to unsubscribe from this mailing, send mail to > > [EMAIL PROTECTED] with a subject of: > > unsubscribe castor-dev > > > -- > Jeremy Haile > [EMAIL PROTECTED] > > ----------------------------------------------------------- > 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