Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-2627

Return Type List gets null on client if an empty list is returned

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 2.1.8
    • 2.2.7
    • JAXB Databinding
    • None
    • JSE 1.5 on Win XP

    Description

      If you have a function that returns an empty list the result will be null on client. Even If add a Responsewrapper to the interface it doesn't work. If have attached a little test project / program:

      Interface:
      @WebService(targetNamespace = "http://cxf.apache.org/demo/CustomerService/1/", name = "CustomerService")
      @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL)
      public interface CustomerService

      { @WebMethod(action = "findCustomer", operationName = "findCustomer") public @WebResult(name = "customerList") List<Customer> findCustomer(); @WebMethod(action = "findCustomer2", operationName = "findCustomer2") @ResponseWrapper(className="demo.service.CustomerListResponse") public @WebResult(name = "customerList") List<Customer> findCustomer2(); }

      The Implementation:

      @WebService(name = "CustomerService", serviceName = "CustomerService", targetNamespace = "http://cxf.apache.org/demo/CustomerService/1/", endpointInterface = "demo.service.CustomerService")
      public class CustomerServiceImpl implements CustomerService {

      public List<Customer> findCustomer()

      { // very stupid method return new ArrayList<Customer>(); }

      public List<Customer> findCustomer2()

      { // another very stupid method return new ArrayList<Customer>(); }

      }

      And this is the main programm:
      public static void main(String args[]) throws Exception

      { new Server(); System.out.println("Server ready..."); // Now Call the Service JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.setServiceClass(CustomerService.class); factory.setAddress("http://localhost:9000/CustomerService"); CustomerService client = (CustomerService) factory.create(); System.out.println("call findCustomer()"); List<Customer> result = client.findCustomer(); if (result != null) System.out.println("Listsize: " + result.size()); else System.out.println("List is null: " + result); System.out.println("call findCustomer2()"); result = client.findCustomer2(); if (result != null) System.out.println("Listsize: " + result.size()); else System.out.println("List is null: " + result); System.out.println("Server exiting"); System.exit(0); }

      This will print the following output:

      Server ready...
      call findCustomer()
      20.01.2010 07:49:45 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose
      INFO: Outbound Message
      ---------------------------
      ID: 1
      Address: http://localhost:9000/CustomerService
      Encoding: UTF-8
      Content-Type: text/xml
      Headers:

      {SOAPAction=["findCustomer"], Accept=[*/*]}

      Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:findCustomer xmlns:ns2="http://cxf.apache.org/demo/CustomerService/1/"/></soap:Body></soap:Envelope>
      --------------------------------------
      20.01.2010 07:49:45 org.apache.cxf.interceptor.LoggingInInterceptor logging
      INFO: Inbound Message
      ----------------------------
      ID: 1
      Encoding: UTF-8
      Content-Type: text/xml; charset=utf-8
      Headers:

      {Content-Length=[194], Server=[Jetty(6.1.21)], content-type=[text/xml; charset=utf-8]}

      Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:findCustomerResponse xmlns:ns2="http://cxf.apache.org/demo/CustomerService/1/"/></soap:Body></soap:Envelope>
      --------------------------------------
      List is null: null
      call findCustomer2()
      20.01.2010 07:49:45 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose
      INFO: Outbound Message
      ---------------------------
      ID: 2
      Address: http://localhost:9000/CustomerService
      Encoding: UTF-8
      Content-Type: text/xml
      Headers:

      {SOAPAction=["findCustomer2"], Accept=[*/*]}

      Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:findCustomer2 xmlns:ns2="http://cxf.apache.org/demo/CustomerService/1/"/></soap:Body></soap:Envelope>
      --------------------------------------
      20.01.2010 07:49:45 org.apache.cxf.interceptor.LoggingInInterceptor logging
      INFO: Inbound Message
      ----------------------------
      ID: 2
      Encoding: UTF-8
      Content-Type: text/xml; charset=utf-8
      Headers:

      {Content-Length=[300], Server=[Jetty(6.1.21)], content-type=[text/xml; charset=utf-8]}

      Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:findCustomer2Response xmlns:ns2="http://cxf.apache.org/demo/CustomerService/1/"><return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/></ns2:findCustomer2Response></soap:Body></soap:Envelope>
      --------------------------------------
      List is null: null
      Server exiting

      Attachments

        1. EmptyListExample-2.2.9.log
          5 kB
          Kaj Kandler
        2. EmptyListExample-2.2.9.zip
          16 kB
          Kaj Kandler
        3. EmptyListExample.zip
          10 kB
          Marc Baumgartner

        Issue Links

          Activity

            People

              dkulp Daniel Kulp
              mabaumga Marc Baumgartner
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: