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

Marc Baumgartner updated CXF-2627:
----------------------------------

    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


  was:
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



> Return Type List gets null on client if an empty list is returned
> -----------------------------------------------------------------
>
>                 Key: CXF-2627
>                 URL: https://issues.apache.org/jira/browse/CXF-2627
>             Project: CXF
>          Issue Type: Bug
>          Components: JAXB Databinding
>    Affects Versions: 2.1.8
>         Environment: JSE 1.5 on Win XP
>            Reporter: Marc Baumgartner
>            Priority: Critical
>         Attachments: EmptyListExample.zip
>
>
> 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

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

Reply via email to