cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Benson Margulies (JIRA)" <j...@apache.org>
Subject [jira] Resolved: (CXF-1770) org.apache.cxf.aegis.type.collection.CollectionType createCollection method returns ArrayList object for typeClass java.util.SortedSet
Date Fri, 29 Aug 2008 01:33:44 GMT

     [ https://issues.apache.org/jira/browse/CXF-1770?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Benson Margulies resolved CXF-1770.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.2
         Assignee: Benson Margulies

revision 690067.

> org.apache.cxf.aegis.type.collection.CollectionType createCollection method returns ArrayList
object for typeClass java.util.SortedSet
> --------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-1770
>                 URL: https://issues.apache.org/jira/browse/CXF-1770
>             Project: CXF
>          Issue Type: Bug
>          Components: Aegis Databinding
>    Affects Versions: 2.1.2
>         Environment: Microsoft Windows XP, Java 1.5.0.14, Tomcat 5.5
>            Reporter: Sarah Haskins
>            Assignee: Benson Margulies
>            Priority: Minor
>             Fix For: 2.2
>
>
> In attempting to populate a POJO with the response from a WSDL using Aegis databinding,
I am getting the exception...
> Caused by: org.apache.cxf.aegis.DatabindingException: No write method for property {http://domain.webmap.gis.doitt.nyc.gov}fields
in class gov.nyc.doitt.gis.webmap.domain.DataStoreRenderer
> 	at org.apache.cxf.aegis.type.basic.BeanType.writeProperty(BeanType.java:243)
> 	at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:147)
> 	at org.apache.cxf.aegis.type.basic.ArrayType.readCollection(ArrayType.java:89)
> 	at org.apache.cxf.aegis.type.collection.CollectionType.readObject(CollectionType.java:48)
> 	at org.apache.cxf.aegis.type.basic.BeanType.readObject(BeanType.java:145)
> 	at org.apache.cxf.aegis.AegisXMLStreamDataReader.read(AegisXMLStreamDataReader.java:82)
> 	at org.apache.cxf.aegis.databinding.XMLStreamDataReader.read(XMLStreamDataReader.java:47)
> My POJOs looks like:
> public class DataStoreRenderer extends Persistent {
> 	private SortedSet<DataStoreRendererField> fields = new TreeSet<DataStoreRendererField>();
>         ...
> 	public SortedSet<DataStoreRendererField> getFields() {
> 		return fields;
> 	}
> 	
> 	public void setFields(SortedSet<DataStoreRendererField> fields) {
> 		this.fields = fields;
> 	}
>         ...
> }
> public class DataStoreRendererField implements Comparable<DataStoreRendererField>
{
>         ...
> 	public int compareTo(DataStoreRendererField o) {
> 		...
> 	}
> }
> A simplied version of the response being bound looks like this...
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>     <soap:Body>
>         <ns1:getApplicationResponse xmlns:ns1="http://service.webmap.gis.doitt.nyc.gov/">
>             <application>
>                 <ns2:dataStoreRenderers xmlns:ns2="http://domain.webmap.gis.doitt.nyc.gov">
>                     <ns2:DataStoreRenderer>
>                     <ns2:fields>
>                         <ns2:DataStoreRendererField>
>                             <ns2:id>1</ns2:id>
>                         </ns2:DataStoreRendererField>
>                         <ns2:DataStoreRendererField>
>                             <ns2:id>2</ns2:id>
>                         </ns2:DataStoreRendererField>
>                         <ns2:DataStoreRendererField>
>                             <ns2:id>3</ns2:id>
>                         </ns2:DataStoreRendererField>
>                         <ns2:DataStoreRendererField>
>                             <ns2:id>4</ns2:id>
>                         </ns2:DataStoreRendererField>
>                     </ns2:fields>
>                     </ns2:DataStoreRenderer>
>                 </ns2:dataStoreRenderers>
>             </application>
>         </ns1:getApplicationResponse>
>     </soap:Body>
> </soap:Envelope>
> After debugging through the code I found that the exception is thrown because there xml
is converted into an ArrayList and then when an appropriate setter is looked for we cannot
find any that take ArrayList.  Once I found that out I debugged some more and found that the
org.apache.cxf.aegis.type.collection.CollectionType.createCollection() method was the one
creating the ArrayList.  The solution I had in mind was simply to add another else if statement
(between List and Set) inside this createCollection method that would do the following...
> protected Collection<Object> createCollection() {
>         Collection values = null;
>         if (getTypeClass().isAssignableFrom(List.class)) {
>             values = new ArrayList();
>         } else if (getTypeClass().isAssignableFrom(SortedSet.class)) {
>             values = new TreeSet();
>         } else if (getTypeClass().isAssignableFrom(Set.class)) {
>             values = new HashSet();
>         } else if (getTypeClass().isAssignableFrom(Vector.class)) {
>             values = new Vector();
>         } else if (getTypeClass().isInterface()) {
>             values = new ArrayList();
>         } else {
>             try {
>                 values = (Collection<Object>)getTypeClass().newInstance();
>             } catch (Exception e) {
>                 throw new DatabindingException("Could not create map implementation:
"
>                                                + getTypeClass().getName(), e);
>             }
>         }
>         return values;
>     }
> Although it is possible that not everyone has implemented Comparable on the object contained
in a SortedSet, wouldn't it be better to at least create a TreeSet as the default, rather
than an ArrayList?  That way no exception will be thrown and the code won't fail to complete?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message