Small error in the previous post in regards to namespace, probably
negligible, here's the SOAP response:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:xsd="http://www.w3.org/2001/XMLSchema";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
   <soap:Body>
      <getStringsResponse xmlns="http://DefaultNamespace";>
         <out xmlns="http://DefaultNamespace";>
            <string>elem 1</string>
            <string>elem 2</string>
         </out>
      </getStringsResponse>
   </soap:Body>
</soap:Envelope>




Zarar Siddiqi wrote:
> 
> Did some more work on this, I though it might be related to me exposing
> the service via JSR 181 instead of through services.xml but thats not the
> case (never made sense anyways).  
> 
> Even if I have the following very simple operation exposed, the client
> fails to bind the returning collection into the ArrayOfString object.  The
> SOAP response is correct but when I try to access the list using the API
> generated using the wsgen task, the list is always empty.  
> 
> Has anybody actually got a Collection to return using a web service?  I've
> posted my complete configuration.
> 
> Here's the service class:
> 
> public Collection<String> getStrings() {
>     Collection<String> list = new ArrayList<String>();
>     list.add("elem 1");
>     list.add("elem 2");
>     return list;
> }
> 
> Here's the services.xml:
> 
> <beans xmlns="http://xfire.codehaus.org/config/1.0";>
>   <service>
>     <name>StringService</name>
>     <serviceClass>StringService</serviceClass>
>   </service>
> </beans>
> 
> 
> Here's the sample client code:
> 
> Service serviceModel = new
> ObjectServiceFactory().create(StringServicePortType.class);
> StringServicePortType service = (StringServicePortType) new
> XFireProxyFactory().create(serviceModel, SERVICE_URL);
> ArrayOfString strings = service.getStrings();
> System.out.println("strings = " + strings.getString().size()); // always
> zero
> 
> Here's the response I captured using TCPMON:
> 
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>    <soap:Body>
>       <getStringsResponse xmlns="http://xfire.codehaus.org/BookService";>
>          <out xmlns="http://xfire.codehaus.org/BookService";>
>             <string>elem 1</string>
>             <string>elem 2</string>
>          </out>
>       </getStringsResponse>
>    </soap:Body>
> </soap:Envelope>
> 
> 
> Here's the complete WSDL:
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <wsdl:definitions targetNamespace="http://DefaultNamespace";
> xmlns:tns="http://DefaultNamespace";
> xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/";
> xmlns:soap12="http://www.w3.org/2003/05/soap-envelope";
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/";
> xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding";
> xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";>
>   <wsdl:types>
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> attributeFormDefault="qualified" elementFormDefault="qualified"
> targetNamespace="http://DefaultNamespace";>
> <xsd:element name="getStrings">
> <xsd:complexType/>
> </xsd:element>
> <xsd:complexType name="ArrayOfString">
> <xsd:sequence>
> <xsd:element maxOccurs="unbounded" minOccurs="0" name="string"
> nillable="true" type="xsd:string"/>
> </xsd:sequence>
> </xsd:complexType>
> <xsd:element name="getStringsResponse">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true"
> type="tns:ArrayOfString"/>
> </xsd:sequence>
> </xsd:complexType>
> </xsd:element>
> </xsd:schema>
>   </wsdl:types>
>   <wsdl:message name="getStringsResponse">
>     <wsdl:part name="parameters" element="tns:getStringsResponse">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:message name="getStringsRequest">
>     <wsdl:part name="parameters" element="tns:getStrings">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:portType name="StringServicePortType">
>     <wsdl:operation name="getStrings">
>       <wsdl:input name="getStringsRequest"
> message="tns:getStringsRequest">
>     </wsdl:input>
>       <wsdl:output name="getStringsResponse"
> message="tns:getStringsResponse">
>     </wsdl:output>
>     </wsdl:operation>
>   </wsdl:portType>
>   <wsdl:binding name="StringServiceHttpBinding"
> type="tns:StringServicePortType">
>     <wsdlsoap:binding style="document"
> transport="http://schemas.xmlsoap.org/soap/http"/>
>     <wsdl:operation name="getStrings">
>       <wsdlsoap:operation soapAction=""/>
>       <wsdl:input name="getStringsRequest">
>         <wsdlsoap:body use="literal"/>
>       </wsdl:input>
>       <wsdl:output name="getStringsResponse">
>         <wsdlsoap:body use="literal"/>
>       </wsdl:output>
>     </wsdl:operation>
>   </wsdl:binding>
>   <wsdl:service name="StringService">
>     <wsdl:port name="StringServiceHttpPort"
> binding="tns:StringServiceHttpBinding">
>       <wsdlsoap:address
> location="http://localhost:8080/xfirespring/services/StringService"/>
>     </wsdl:port>
>   </wsdl:service>
> </wsdl:definitions>
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Zarar Siddiqi wrote:
>> 
>> The XFire client generated using wsgen (default jaxb binding) has trouble
>> binding the returned SOAP message to Java objects when using a Collection
>> as a return type.  It works for all other cases but as soon as I try to
>> return a Collection or an array, the binding fails.  The correct soap
>> message is returned from the server but when I use the API to print the
>> values the list size is always zero even though the soap message
>> contained multiple items corresponding to the collection:
>> 
>> ArrayOfUser users = service.getUsers(..);
>> System.out.println(users.getUser().size()); // always prints 0
>> 
>> I've annotated one of my domain objects (User) with an Aegis annotation
>> to prevent the properties being wrapped around the JAXBElement type,
>> aside from that nothing "weird" is going on.
>> 
>> The docs say that I don't need to specify a .aegis.xml file if I'm using
>> Java5 Generics and that the binding should happen normally.
>> http://xfire.codehaus.org/Mapping+collections
>> 
>> I'm not making any changes to the generated code.  Any help is
>> appreciated.
>> 
>> I'm running XFire 1.2.4 with JDK 1.5.0_11 and have the following service
>> exposed using JSR 181 annotations.  
>> 
>> @WebService
>> public interface UserService {
>> 
>>     public Collection<User> getUsers(String authority)
>>             throws WebServiceException;
>> }
>> 
>> 
>> @WebService(serviceName="UserSoapService", endpointInterface =
>> "com.arsenalist.UserService")
>> @InHandlers  (handlers={ // my in-handlers  })
>> @OutHandlers (handlers={ // my out-handlers })
>> public class UserSoapService implements UserService {
>> 
>>     public Collection<User> getUsers(String authority)
>>             throws WebServiceException {
>>             
>>             // return a list of users
>>      }
>> }
>> 
>> public class User {
>>      private String username;
>>      
>>      @XmlElement(minOccurs="1")
>>      public String getUsername() {
>>              return username;
>>      }
>>      
>>      public void setUsername(String username) {
>>              this.username = username;
>>      }
>> }
>> 
>> 
>> My spring configuration is as follows:
>> 
>> <bean id="webAnnotations"
>>      
>> class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"/>
>> <bean id="handlerMapping"
>>       class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">
>>     <property name="typeMappingRegistry">
>>         <ref bean="xfire.typeMappingRegistry"/>
>>     </property>
>>     <property name="xfire">
>>         <ref bean="xfire"/>
>>     </property>
>>     <property name="webAnnotations">
>>         <ref bean="webAnnotations"/>
>>     </property>
>> </bean>
>> 
>> <bean
>> class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
>>     <property name="urlMap">
>>         <map>
>>             <entry key="/">
>>                 <ref bean="handlerMapping"/>
>>             </entry>
>>         </map>
>>     </property>
>> </bean>
>> 
>> <bean id="userSoapService" class="com.arsenalist.UserSoapService"/>
>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Problem-returning-a-Collection-or-an-array-using-generics-tf3364015.html#a9374217
Sent from the XFire - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to