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