2012-06-21 3 views
2

Ma tâche consiste à écrire un service Web pour une opération de mise à jour où une liste d'objets est transmise à la méthode.JAXB Liaison pour paramètre de demande SOAP dans JAXWS

@WebMethod(operationName = "updateObjects", action = "urn:preferences") 
public boolean updateObjects(List<MyObject> objects){ 

} 

La classe MyObject est assez simple.

@XmlRootElement(name="Object") 
public class MyObject{ 
    private String item1; 
    private String item2; 
} 

Maintenant l'énoncé du problème. Quand je regarde la requête SOAP pour cette méthode (que l'interface utilisateur SOAP généré pour moi), la demande ressemble ci-dessous:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <pref:updateObjects> 
     <!--Zero or more repetitions:--> 
     <arg0> 
      <!--Optional:--> 
      <item1>?</item1> 
      <!--Optional:--> 
      <item2>?</item2> 
     </arg0> 
     </pref:updateObjects> 
    </soapenv:Body> 
</soapenv:Envelope> 

mais je veux qu'il ressemble comme ci-dessous.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <pref:updateObjects> 
     <!--Zero or more repetitions:--> 
     <Objects> 
      <Object> 
       <!--Optional:--> 
       <item1>?</item1> 
       <!--Optional:--> 
       <item2>?</item2> 
      </Object> 
      <Object> 
       <!--Optional:--> 
       <item1>?</item1> 
       <!--Optional:--> 
       <item2>?</item2> 
      </Object> 
     </Objects> 
     </pref:updateObjects> 
    </soapenv:Body> 
</soapenv:Envelope> 

Quelqu'un peut-il vous conseiller. Merci d'avance.

Répondre

5

Vous avez seulement besoin d'ajouter un « emballage » à votre List d'objets comme celui-ci:

@XmlRootElement(name="objects") 
public class MyObjects{ 

    @XmlElement(name="object") 
    List<MyObject> myObjects; 
} 

public class MyObject{ 
    private String item1; 
    private String item2; 
} 

REMARQUE: changer l'élément racine arg0-objects avec l'étiquette @XmlRootElement(name="objects") ne fonctionnera pas parce que votre <objects> n'est pas un élément racine dans la définition du service Web. En fait, il fait partie de votre <wsdl:message> (donc JAXB va le déconnecter).

Ce que vous devez changer est le message de service Web en ajoutant un @WebParam(name = "objects") à votre @WebMethod comme:

@WebMethod(operationName = "updateObjects", action = "urn:preferences") 
public boolean updateObjects(@WebParam(name = "objects") MyObjects objects){ 

} 

Si vous ne voulez pas utiliser un « emballage », vous pouvez garder votre WebMethod mais comme ceci:

@WebMethod(operationName = "updateObjects", action = "urn:preferences") 
public boolean updateObjects(@WebParam(name = "object") List<MyObject> objects){ 

} 

mais vous perdrez l'emballage <objects>. La demande doit être quelque chose comme ceci:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pref="preferences"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <pref:updateObjects> 
     <!--Zero or more repetitions:--> 
     <object> 
      <!--Optional:--> 
      <item1>?</item1> 
      <!--Optional:--> 
      <item2>?</item2> 
     </object> 
     </pref:updateObjects> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

Merci beaucoup pour la réponse rapide ggarcio .. Est-ce pas là une manière que nous pouvons le faire sans créer de la classe d'emballage (par une annotation qui fait cette enveloppe pour nous)? J'ai 8 telles méthodes pour différentes liste d'objets :( – Vinay

+0

Vérifiez la réponse mise à jour :-) – ggarciao

+0

Cela a fonctionné monsieur ... m'a sauvé un certain temps .. Acceptez votre réponse .. Cheers ... – Vinay

Questions connexes