2013-05-07 5 views
6

Sono nuovo ai servizi Web e ho creato un progetto di base in Eclipse con un metodo esposto. Sono stato in grado di distribuire il mio webservice e funziona perfettamente. Il codice è sottoCreazione di un servizio Web con tipi complessi

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

@WebService(targetNamespace="http://test.com", name="testService") 
public class WebService { 
    @WebMethod(operationName="start") 
    public String start(@WebParam(name="inputParameter") String inputParameter) { 
     return startMethod(inputParameter); 
    } 
} 

La mia domanda è come impostare questo metodo per gestire tipi complessi. Voglio ricevere un numero di parametri, ma non voglio semplicemente riceverli come un mucchio di stringhe. Stavo pensando di avere una specie di oggetto wrapper che contenesse tutti i parametri necessari per il mio metodo. Qualche consiglio su come farlo? Ho bisogno di ulteriori annotazioni per creare il WSDL? Grazie!

risposta

15

JAX-WS è basato su JAXB in modo che sia possibile passare solo i tipi supportati da JAXB come parametri del metodo Web. Quindi, qualsiasi classe definita dall'utente correttamente annotato come indicato di seguito può essere utilizzato come parametro o tipo di ritorno di qualsiasi WebMethod

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Person") 
public class Person {  
    @XmlElement(name = "firstName") 
    protected String firstName;  
    @XmlElement(name = "lastName") 
    protected String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String value) { 
     this.firstName = value; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String value) { 
     this.lastName = value; 
    } 
} 
1

In primo luogo, l'installazione che tipi vostra chiamata webservice o di risposta complessa contiene in WSDL

<xsd:element name="AWebServiceElementName"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element maxOccurs="1" minOccurs="1" name="header" type="tns:ReplyHeader"/> 
         <xsd:element maxOccurs="1" minOccurs="1" name="body"> 
          <xsd:complexType> 
           <xsd:sequence> 
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="acomplextype" type="tns:acomplextype"/> 
            <xsd:element maxOccurs="1" minOccurs="1" name="anothercomplextype" type="tns:anothercomplextype"/> 
           </xsd:sequence> 
          </xsd:complexType> 
         </xsd:element> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 

e quindi definire quali sono i vostri tipi complessi contiene:

 <xsd:complexType name="acomplextype"> 
      <xsd:sequence> 
       <xsd:element maxOccurs="1" minOccurs="1" name="somefieldid" type="xsd:long"/> 
       <xsd:element maxOccurs="1" minOccurs="1" name="somestring" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     <xsd:complexType name="anothercomplextype"> 
      <xsd:sequence> 
       <xsd:element maxOccurs="1" minOccurs="1" name="somefieldid" type="xsd:long"/> 
       <xsd:element maxOccurs="1" minOccurs="1" name="somestring" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 

Sul Java lato è necessaria una classe wrapper che contiene questi campi con getter e setter