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