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