复杂自定义对象作为服务器端 SOAP Web 服务的参数不起作用

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

我必须编写一个 SOAP web 服务,我正在为此使用 JAXB 和 Axis2。 webservice 方法将有点复杂的对象作为输入参数,然后它应该处理 return 另一个复杂的自定义对象。

现在参数中预期的对象结构是:

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;
            }

        }

    }

}

webservice中的代码如下:

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

wsdl 生成的结构如下:

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

现在在 WSDL 中不处理嵌套模式,xs:anyType 将取代 SoftwarePart。同样,即使我使用了 JAXB 注释,很多内部 类' 定义也不会出现在模式中。

任何人都可以帮助我吗?

已通过将 JAXB pojo 中的所有 ArrayList 更改为简单数组 [] 来修复此问题。 希望这对某人有所帮助。