2010-01-31 5 views
2

J'ai un service web en Java qui a été implémenté sur jax-ws. Ce service Web renvoie une liste générique d'utilisateurs. Ça fonctionne très bien :).Comment configurer WebService pour renvoyer ArrayList au lieu de Array?

@Stateless(name = "AdminToolSessionEJB") 
@RemoteBinding(jndiBinding = "AdminToolSessionRemote") 
@Remote(AdminToolSessionRemote.class) 
@WebService 
public class AdminToolSessionBean implements AdminToolSessionRemote { 
... 
@WebMethod(operationName = "GetAllUsers") 
@WebResult(name = "AllUsers") 
public List<User> getAllUsers() { 
    return userSessionRemote.getAllUsers(); 
} 
... 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "User") 
public class User extends BasicDataTransferObject { 
... 
@XmlElement(name = "Groups") 
private List<Group> groups; 
... 
} 

Mais je vais utiliser ce service web dans les applications .Net. Lorsque j'ajoute ce service web en tant que service wcf ou service web dans VS2005 ou VS2008 ou VS2010, VS génère un tableau à la place de la liste générique 'Group [] Groups'. Je change 'Type de collection' dans la boîte de dialogue 'Configuration Service Reference ...' à 'System.Collections.Generic.List' mais VS génère un tableau :(.

Je dois générer VS liste générique ou ArrayList, ce que je devrais faire?

Répondre

1

Je recommande de ne pas utiliser des constructions linguistiques spécifiques dans un webservice, car un webservice est censé être la langue agnostique.

Si vous voulez vraiment, mais vous ne devriez pas vous devrez écrire un sérialiseur/désérialiseur spécifique dont vous ne pouvez pas être sûr qu'il fonctionnera dans toutes les langues

Je voudrais juste coller à un tableau, puis écrire un wrapper dans la langue de votre choix.

2

Je ne sais pas comment définir ceci en Java. Cependant, dans mon service C#, mon principal paramètre de transaction (ordre d'achat) contient une liste d'éléments de ligne définie comme ceci:

private LineItems LineItemsField; 
[DataMember(Order=13, EmitDefaultValue=false)] 
public LineItems LineItems { 
    get { return this.LineItemsField; } 
    set { this.LineItemsField = value; } 
} 

LineItems est une autre classe C#, défini comme ceci:

[CollectionDataContract(Namespace="")] 
public class LineItems : List<LineItem> 
{ 
} 

LineItem est la classe réelle qui contient les champs d'élément de campagne.

Le LineItems apparaît dans WSDL comme:

<s:element minOccurs="0" maxOccurs="1" name="LineItems" type="tns:ArrayOfLineItem" /> 

ArrayOfLineItem est défini comme:

<s:complexType name="ArrayOfLineItem"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="unbounded" name="LineItem" nillable="true" type="tns:LineItem" /> 
    </s:sequence> 
</s:complexType> 

Et bien sûr, la classe elle-même LineItem est définie ailleurs. J'espère que ça aide.

+0

Merci pour votre aide, oui dans .Net, service web générer WSDL comme votre échantillon pour la liste et la collection. Mais je ne pouvais pas faire ce WSDL par jaxb, pour le test j'écris un fichier XSD et fais une structure comme celle-ci dit malheureusement que ce WSDL pratique ne génère pas de liste aussi. Pas de problème mon collègue écris un mappeur pour mapper notre DTO à notre modèle voulu. C'est une bonne solution, mais chaque fois que j'ai du temps libre, testez votre idée. –

Questions connexes