cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Kulp <dk...@apache.org>
Subject Re: HashMap with XmlJavaTypeAdapter key/value
Date Mon, 05 Jan 2009 18:53:16 GMT

I think the only solution is a specific adapter for each mapping.   Definitely 
less than ideal.  

The best place to ask for advice would be on the jaxb lists:
https://jaxb.dev.java.net/servlets/ProjectMailingListList

Dan



On Friday 19 December 2008 10:45:07 am Vasco Asturiano wrote:
> Hello all,
>
> I am trying to render the following attribute:
>
> HashMap<SomeClass, AnyOtherClass> myField;
>
> SomeClass is not my class and is not xml annotated, therefore I created
> a type adapter for it, which is included in the package-info.java:
>
> @XmlJavaTypeAdapter(value=SomeClassAdapter.class,type=SomeClass.class)
>
> The adapter contains something like:
>
> public class SomeClassAdapter extends XmlAdapter<String, SomeClass> {
>     @Override
>     public String marshal(SomeClass c){
>         return c.toString();
>     }
>
>     @Override
>     public SomeClass unmarshal(String s) {
>         return new SomeClass(s);
>     }
> }
>
> This solution works fine when rendering direct attributes, as well as
> lists and arrays:
>
> SomeClass c;
> SomeClass[] arr;
> List<SomeClass> lst;
>
> But fails when rendering HashMap. The type adapter is not called when
> the class is either the key or the value of a HashMap, and therefore the
> attribute myField is rendered empty in the resulting XML.
>
> After researching for existing solutions I have tried is to create a
> generic parametrizable adapter for the HashMap:
>
> public class HashMapAdapter<K, V> extends
> XmlAdapter<ArrayList<MapEntry<K, V> , HashMap<K, V>>
>
> This is the MapEntry class:
>
> @XmlAccessorType(XmlAccessType.FIELD)
>     public class MapEntry<K, V> {
>       private K key;
>       private V value;
>
>       private MapEntry(K key, V value) {
>           this.key = key;
>           this.value = value;
>       }
>
>       public K getKey() {
>           return key;
>       }
>
>       public V getValue() {
>           return value;
>       }
>     }
>
> However, this solution also doesn't work. Apparently, the key attribute
> in the above class would only call the appropriate type adapter if it is
> defined statically of being of that type, that is:
>
> private SomeClass key;
>
> Unfortunately, we have many combinations of different classes with
> adapters which can be either key, or value, or both. Therefore declaring
> the type statically would force us to declare an HashMap adapter for
> each of the possible combinations.
>
> Did somebody else also came across the same problem and was able to find
> work around it?
>
> Thanks plenty,



-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog

Mime
View raw message