Search code examples
web-servicessoapjaxbapache-axis

Complex Custom Object as Paramter to SOAP webservice in serverside not working


I have to write a SOAP webservice and for which I am using JAXB and Axis2. The webservice method will take somewhat complex Object as input parameter and then it should process and return another complex custom Object.

Now the structure of my object which is expected in parameter is:

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.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "softwarepart", propOrder = {
    "approved",
    "desc",
    "users",
    "associatedchipparts"
})
@XmlRootElement(name = "softwarepart")
public class Softwarepart {

    public boolean approved;
    public String desc;    
    public Softwarepart.Users users;
    public Softwarepart.Associatedchipparts associatedchipparts;

    public boolean isApproved() {
        return approved;
    }

    public void setApproved(boolean value) {
        this.approved = value;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String value) {
        this.desc = value;
    }

    public Softwarepart.Users getUsers() {      
        return this.users;
    }


    public void setUsers(Softwarepart.Users usrs) {
        this.users = usrs;
    }


    public Softwarepart.Associatedchipparts getAssociatedchipparts() {

        return this.associatedchipparts;
    }


    public void setAssociatedchipparts(
            Softwarepart.Associatedchipparts chipparts) {
        this.associatedchipparts = chipparts;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "associatedchipparts", propOrder = {
        "associatedchippart"
    })
    @XmlRootElement(name = "associatedchipparts")
    public static class Associatedchipparts {

        public List<Softwarepart.Associatedchipparts.Associatedchippart> associatedchippart;

        public List<Softwarepart.Associatedchipparts.Associatedchippart> getAssociatedchippart() {
            if (associatedchippart == null) {
                associatedchippart = new ArrayList<Softwarepart.Associatedchipparts.Associatedchippart>();
            }
            return this.associatedchippart;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "associatedchippart", propOrder = {
            "partNumber",
            "mpn"
        })
        @XmlRootElement(name = "associatedchippart")
        public static class Associatedchippart {

            public String partNumber;
            public String mpn;

            public String getPartNumber() {
                return partNumber;
            }

            public void setPartNumber(String value) {
                this.partNumber = value;
            }

            public String getMpn() {
                return mpn;
            }

            public void setMpn(String value) {
                this.mpn = value;
            }

        }

    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "users", propOrder = {
        "user"
    })
    @XmlRootElement(name = "users")
    public static class Users {

        public List<Softwarepart.Users.User> user;

        public List<Softwarepart.Users.User> getUser() {
            if (user == null) {
                user = new ArrayList<Softwarepart.Users.User>();
            }
            return this.user;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "user", propOrder = {
            "email"
        })
        @XmlRootElement(name = "user")
        public static class User {
            public String email;

            public String getEmail() {
                return email;
            }

            public void setEmail(String value) {
                this.email = value;
            }

        }

    }

}

The Code in webservice is like below :

public class SoftwarePartCreator {
    public String createSoftwarePart(SoftwarePartsList softwareList,String postURL) {
        return "created";
    }

The wsdl generated structure as below :

<wsdl:types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://packagename/xsd">
        <xs:complexType name="SoftwarePartsList">
        <xs:sequence>
            <xs:element minOccurs="0" name="softwarePart" nillable="true" type="xs:anyType"/>
            <xs:element minOccurs="0" name="status" nillable="true" type="xs:string"/>
        </xs:sequence>
        </xs:complexType>
    </xs:schema>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:ax24="http://packagename/xsd">
        <xs:element name="createSoftwarePart">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="softwareList" nillable="true" type="ax23:SoftwarePartsList"/>
                <xs:element minOccurs="0" name="postURL" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
        </xs:element>
        <xs:element name="createSoftwarePartResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
        </xs:element>
    </xs:schema>
</wsdl:types>

Now in WSDL nested schema is not handled and xs:anyType is coming instead of SoftwarePart. Similarly lots of inner classes' definition is not coming in the schema even though I have used JAXB annotations.

Any one can help me on this ?


Solution

  • This was fixed by changing all the ArrayList to simple array [] in the JAXB pojos. Hope this helps someone.