2016-08-24 1 views
0

Dans mon application, je dois consommer un service fourni par une application tierce. La réponse qu'ils fournissent est toujours 200 et ils changent le corps selon que les données sont disponibles ou non ou erreur, comme indiqué ci-dessousComment consommer XML avec plus d'un élément racine possible dans le client Spring REST

Si les données sont là alors

<products> 
    <product></product> 
    <product></product> 
</products> 

Si les données est vide,

<message> No record found </message> 

Si une validation a échoué alors

<error>Invalid Id</error> 

J'utilise RestTemplate.exchange pour consommer le service, ma question est s'il n'y a qu'un seul type d'élément racine alors nous passons la classe respective comme ParameterizedTypeReference mais ici comment mapper la réponse et unmarshall it.

+0

Une solution pourrait être d'encapsuler le message avec une nouvelle étiquette avant d'analyser le message. Quelque chose comme ... – reos

Répondre

0

Utilisez jaxb ou jackson pour unmarshall le xml.

0

La bonne chose à faire ici est de demander au tiers de changer sa réponse de service pour avoir une étiquette racine. L'objet de réponse serait alors ressembler à quelque chose comme ceci:

<response> 
<products> 
    <product></product> 
    <product></product> 
</products> 
<message> No record found </message> 
<error>Invalid Id</error> 
</response> 

Avec cela, vous aurez seulement besoin d'être préoccupé par response objet et vous pouvez vérifier la présence de sous-étiquettes respectives.

L'autre option pour que cela fonctionne pour vous est de faire l'échange en passant String.class comme référence de type. Ensuite, vous devrez effectuer la vérification dans votre code pour voir si la réponse de chaîne retournée est products ou message ou error