2013-04-18 14 views
6

Zajmuję się tworzeniem usługi WWW z kilkoma metodami, które przyjmują identyczne złożone typy danych wejściowych. Typy danych mają adnotacje i setery JAXB i pobierające, a klasa usługi WWW ma adnotacje JAX-WS.JAX-WS powtarza typ złożony podczas generowania klucza wsdl

Szablon mojego pliku service.java:

@WebService(serviceName = "ServiceWS") 
public class SericeWS { 

private static ServiceIF serviceImpl; 

static { 
    serviceImpl = new ServiceImpl(); 
} 

public Result Method1(Credentials credentials) { 
     @WebParam(name = "credentials") Credentials credentials) { 

    return serviceImpl.Method1(credentials); 
} 

    public Result Method2(Credentials credentials) { 
     @WebParam(name = "credentials") Credentials credentials) { 

    return serviceImpl.Method2(credentials); 
} 

}

EDIT: Mój plik Credentials.java:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "name", 
    "password" 
}) 
@XmlRootElement(name = "Credentials") 
public class Credentials implements MyBean { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String password; 

    /** 
    * Gets the value of the name property. 
    * 
    * @return The name property of the credentials 
    *  
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * Sets the value of the name property. 
    * 
    * @param value The name property of the credentials 
    *  
    */ 
    public void setName(String value) { 
     this.name = value; 
    } 

    /** 
    * Gets the value of the password property. 
    * 
    * @return The password property of the credentials 
    *  
    */ 
    public String getPassword() { 
     return password; 
    } 

    /** 
    * Sets the value of the password property. 
    * 
    * @param value The password property of the credentials 
    *  
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

Usługa jest rozmieszczony w Tomcat i WSDL jest auto generowany. Podczas generowania kodu pośredniczącego klienta za pomocą programu wsimport uzyskuje się duplikację typu Credentials (Credentials, Method1.Credentials i Method2.Credentials), tj. Inną (wewnętrzną) klasę dla każdej metody.

Wydaje się, że problem arrises kiedy WSDL i schemat są generowane:

<xs:schema xmlns:tns="http://service.my.package.com/"    
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" 
targetNamespace="http://service.my.package.com/"> 
<xs:element name="Credentials"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="name" type="xs:string"/> 
    <xs:element name="password" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
.... 
<xs:complexType name="getLockBoxKeys"> 
<xs:sequence> 
    <xs:element name="credentials" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="name" type="xs:string"/> 
    <xs:element name="password" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element>  
..... 

Jak mogę zrobić to wszystko praca taka, że ​​mam tylko jedną definicję poświadczenia? Jestem całkiem nowy w usługach internetowych, JAX-WS i JAXB, więc nie jestem pewien, czy mam odpowiednie adnotacje.

Każda pomoc zostanie bardzo doceniona.

+1

Pokaż nam klasy z adnotacjami JAXB. – acdcjunior

+0

Dzięki za odpowiedź. Zmodyfikowałem oryginalne pytanie, aby dodać plik Credentials.java. Daj mi znać, jeśli chcesz zobaczyć cokolwiek innego. – juniz

Odpowiedz

3

Nie udzielę wyczerpującej odpowiedzi wyjaśniającej wszystkie zasady, ponieważ nie pamiętam/nie rozumiem ich wszystkich.

Ale myślę, że jeśli dodasz element name do adnotacji @XMLType, otrzymasz to, czego szukasz (lub przynajmniej nieco dalej).

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Credentials", propOrder = { 
    "name", 
    "password" 
}) 
@XmlRootElement(name = "Credentials") 
public class Credentials { 

BTW, oryginalny plik service.java nie wydaje się zbyt czysto wklej (miał kilka błędnych szelki chyba) utrudniając ktoś odtworzyć.

+0

Działa, dziękuję bardzo! Zrobiłeś mój dzień ... I postaram się być bardziej ostrożny przy wycinaniu i wklejaniu następnym razem, gdy opublikuję pytanie na SO. – juniz

+1

@Julien, Byłoby miło, gdybyś zaakceptował tę odpowiedź. –

1

W pliku MyCredentials.java nazwa @XmlRootElement (name = "Credentials") zaczyna się od dużej litery C i w @WebParam (name = "credentials"), której nie ma. Może to z tego powodu?