2016-01-13 102 views
1

我必须编写SOAP Web服务,并且我正在使用JAXB和Axis2。 webservice方法会将一些复杂的Object作为输入参数,然后处理并返回另一个复杂的自定义对象。复杂的自定义对象作为参数SOAP服务器中的web服务器不起作用

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

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

     } 

    } 

} 

中的代码web服务是象下面这样:

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即将instea d的SoftwarePart。类似的,很多内部类的定义并不在模式中,即使我已经使用了JAXB注释。

任何人都可以帮助我呢?

回答

1

这是通过在JAXB pojos中将所有ArrayList更改为简单数组[]来解决的。 希望这可以帮助别人。