2013-04-18 6 views
6

Sto sviluppando un servizio Web con diversi metodi che utilizzano come input tipi di dati complessi identici. I tipi di dati hanno annotazioni JAXB, setter e getter e la classe del servizio Web ha annotazioni JAX-WS.JAX-WS duplica il tipo complesso durante la generazione di wsdl

Template del mio file 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: Il mio file 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; 
    } 
} 

Il servizio viene distribuito in Tomcat e WSDL è auto -Generata. Quando si generano gli stub client con wsimport, viene generata una generazione duplicata del tipo di credenziali (Credenziali, Method1.Credentials e Method2.Credentials), ovvero una classe (interna) diversa per ciascun metodo.

Sembra che il problema arrises quando il WSDL e schema vengono generati:

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

Come posso fare tutto questo lavoro in modo tale che ho solo una definizione di credenziali? Sono abbastanza nuovo per i servizi web, JAX-WS e JAXB, quindi non sono sicuro di avere le annotazioni giuste.

Qualsiasi aiuto sarebbe molto apprezzato.

+1

Mostraci le classi annotate JAXB. – acdcjunior

+0

Grazie per la risposta. Ho modificato la domanda originale per aggiungere il file Credentials.java. Fammi sapere se vuoi vedere qualcos'altro. – juniz

risposta

3

Non ho intenzione di dare una risposta completa spiegando tutte le regole, dal momento che non le ricordo/le capisco tutte.

Ma penso che se si aggiunge l'elemento name all'annotazione @XMLType si otterrà ciò che si sta cercando (o almeno un po 'oltre).

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

BTW, il file originale service.java non sembra incollare troppo pulito (aveva alcune coppie non corrette credo) rendendo difficile per chiunque di ricreare.

+0

Funziona, grazie mille! Hai fatto la mia giornata ... E cercherò di essere più attento con il mio taglio e incolla la prossima volta che invierò una domanda su SO. – juniz

+1

@ Julien, Sarebbe bello se accettassi questa risposta. –

1

Nel file MyCredentials.java il nome di @XmlRootElement (name = "Credentials") inizia con una C maiuscola e nel @WebParam (name = "credentials") non è così. Forse è per questo?

Problemi correlati