2013-05-07 5 views
6

Jestem nowicjuszem w zakresie usług sieciowych i stworzyłem podstawowy projekt w czasie zaćmienia za pomocą jednej ujawnionej metody. Byłem w stanie wdrożyć moją usługę sieciową i działa dobrze. Kod znajduje się poniżej.Tworzenie usługi sieciowej o złożonych typach

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

Moje pytanie brzmi: jak ustawić tę metodę, aby radzić sobie ze złożonymi typami. Chcę otrzymać wiele parametrów, ale nie chcę po prostu odbierać ich jako kilka ciągów. Myślałem o jakimś opakowaniu obiektu, który zawierał wszystkie parametry potrzebne do mojej metody. Wszelkie porady, jak to zrobić? Czy potrzebuję dodatkowych adnotacji, aby utworzyć plik WSDL? Dzięki!

Odpowiedz

15

JAX-WS bazuje na JAXB, więc można przekazywać tylko obsługiwane typy JAXB jako parametry metody internetowej. Więc każdy użytkownik definiuje klasa poprawnie opatrzone takimi jak wymienione poniżej mogą być używane jako parametr lub rodzaj powrotu jakiegokolwiek 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

pierwsze, konfigurację co skomplikowane typy wezwanie usługa lub odpowiedź zawiera w swoim 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> 

a następnie zdefiniować jakie są twoje typy złożone zawiera:

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

na Java po stronie trzeba klasy otoki, które zawierają te pola pobierające i ustawiające