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