I have an operation that is returning a messagePart whose element is an
array (wsdl listed below). I have observed that the wsdl2java operation
created the following wrapper object (comments removed): 
 
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "getAllUsersReturn"
})
@XmlRootElement(name = "getAllUsersResponse")
public class GetAllUsersResponse {
 
    @XmlElement(namespace = "https://test.com";, required = true)
    protected List<User> getAllUsersReturn;

    public List<User> getGetAllUsersReturn() {
        if (getAllUsersReturn == null) {
            getAllUsersReturn = new ArrayList<User>();
        }
        return this.getAllUsersReturn;
    }
}

 
The problem I am observing is that even though I can see my actual
service method implementation returning multiple objects, none are
actually added to the SOAP message. Debugging the application has led me
to find the following code block inside the WrapperHelper class:
 
public Object createWrapperObject(List<?> lst) 
            throws Fault {
            
            try {
                Object ret = wrapperType.newInstance();
 
                for (int x = 0; x < setMethods.length; x++) {
                    if (setMethods[x] == null && fields[x] == null) {
                        continue;
                    }
                    Object o = lst.get(x);
                    if (jaxbObjectMethods[x] != null) {
                        o = jaxbObjectMethods[x].invoke(objectFactory,
o);
                    }
                    if (o instanceof List) {
                        List<Object> col =
CastUtils.cast((List)getMethods[x].invoke(ret));
                        if (col == null) {
                            //broken generated java wrappers
                            if (setMethods[x] != null) {
                                setMethods[x].invoke(ret, o);
                            } else {
                                fields[x].set(ret, lst.get(x));
                            }
                        } else {
                            List<Object> olst = CastUtils.cast((List)o);
                            col.addAll(olst);
                        }
                    } else if (setMethods[x] != null) {
                        setMethods[x].invoke(ret, o);
                    } else if (fields[x] != null) {
                        fields[x].set(ret, lst.get(x));
                    }
                }
                return ret;
            } catch (Exception ex) {
                throw new Fault(ex);
            }
        }
 
As one can see, WrapperHelper uses set*** methods to add data to the
wrapper java classes which are in turn marshalled into SOAP. However,
since the getAllUsersResponse wrapper has no set*** method, only a get
message generated from wsdl2java, nothing is returned. Is this an issue
or due to misconfiguration on my part?
 
my wsdl:
 

 ...
 
      <element name="getAllUsersResponse">
        <complexType>
          <sequence>
            <element name="getAllUsersReturn" maxOccurs="unbounded"
type="impl:User"/>
          </sequence>
        </complexType>
      </element>
 
 ... 
 
  <wsdl:message name="getAllUsersResponse">
    <wsdl:part element="impl:getAllUsersResponse" name="parameters"/>
  </wsdl:message>
 
 ...
 
    <wsdl:operation name="getAllUsers">
      <wsdl:input message="impl:getAllUsersRequest"
name="getAllUsersRequest"/>
      <wsdl:output message="impl:getAllUsersResponse"
name="getAllUsersResponse"/>
      <wsdl:fault message="impl:ApiException" name="ApiException"/>
    </wsdl:operation>
 
 ...
 
  <wsdl:binding name="UserServiceSoapBinding" type="impl:UserInterface">
    <wsdlsoap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
 
    <wsdl:operation name="getAllUsers">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="getAllUsersRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getAllUsersResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
      <wsdl:fault name="ApiException">
        <wsdlsoap:fault name="ApiException" use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
 
 ...

Reply via email to