Jax-WS - Pour Supprimer les Balises Vides de Demande XML
Je suis en train de consommer un service web exposée par un fournisseur. Le Fournisseur dispose d'une vérification stricte à sa fin que la requête xml ne doit pas contenir de balises qui n'ont pas de valeurs.
Je suis à l'aide de Jax-WS. Si je ne définissez pas de valeur dans un objet particulier, il est envoyé comme balise vide et la balise est présente. PFB l'exemple illustrant mon problème.
Client XML :
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:host="http://host.testing.webservice.com/">
<soapenv:Header/>
<soapenv:Body>
<host:testingMathod>
<arg0>
<PInfo>
<IAge>45</IAge>
<strName>Danny</strName>
</PInfo>
<strCorrId>NAGSEK</strCorrId>
<strIpAddress></strIpAddress>
</arg0>
</host:testingMathod>
</soapenv:Body>
</soapenv:Envelope>
En cela, la valeur pour l'adresse ip n'est pas donné, et donc la balise vide est envoyé.
Donc de bien vouloir nous laisser moi savoir ce qui doit être fait pour supprimer les balises vides de demande xml. Est Handlerchain est la seule solution pour les mêmes?
Grâce,
Naveen.
Je suis le EclipseLink JAXB (MOXy) plomb et j'ai ajouté une réponse qui devrait vous aider: stackoverflow.com/a/11249220/383861
OriginalL'auteur Naveen Balu | 2012-06-26
Vous devez vous connecter pour publier un commentaire.
Remarque: je suis le EclipseLink JAXB (MOXy) plomb et un membre de la JAXB (JSR-222) groupe d'experts.
Par défaut MOXy comme les autres JAXB implémentations ne maréchal un élément pour les valeurs null:
PROBLÈME POSSIBLE
Je crois que le
strIpAddress
propriété n'est pas nulle, mais contient une valeur de Chaîne vide (""). Ce serait la cause de l'élément vide pour être écrits.Racine
Démo
Sortie
Noter qu'il n'existe pas d'élément mobilisé pour la
nullValue
champ, et leemptyStringValue
champ est mobilisé comme un élément vide.SOLUTION #1 - s'Assurer de la propriété est définie sur null et non pas ""
SOLUTION #2 - Écrire un XmlAdapter qui convertit "" null
Un
XmlAdapter
est un JAXB mécanisme qui permet à un objet, afin de le placer comme un autre objet.StringAdapter
Suivantes
XmlAdapter
rassemblera des chaînes vides comme null. Ce sera la cause de leur de ne pas apparaître dans la représentation XML.paquet-info
La
XmlAdapter
est accroché à l'aide de la@XmlJavaTypeAdapter
annotation. Ci-dessous est un exemple de l'accrochant au niveau du package, de sorte qu'il s'applique à un champs/propriétés de type String dans le package. Pour plus d'informations, voir: http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.htmlSortie
Maintenant la sortie de l'exécution de la démo de code est le suivant:
OriginalL'auteur bdoughan
C'est un problème de la Sérialiseur XML que vous utilisez (Si vous n'avez pas à faire quelque chose de spécial, il devrait être JAXB).
Le "null" politique de la sérialiseur doit être configurable, mais je pense n'est pas possible avec JAXB. Si vous utilisez MOXy vous pouvez utiliser
XmlMarshalNullRepresentation.ABSENT_NODE
à ne pas écrire le nœud s'il est nul. La mise en œuvre devrait être quelque chose comme ceci:PS: Peut-être vous avez besoin de définir également la
emptyNodeRepresentsNull
param de la@XmlNullPolicy
.Pour plus d'informations sur ce sujet, veuillez consulter cette question
@XmlNullPolicy
. Cependant, je crois que le problème est lié à lastrIpAddress
contenant une chaîne vide. J'ai ajouté une réponse qui démontre comment ce pourrait être résolu avec uneXmlAdapter
: stackoverflow.com/a/11249220/383861OriginalL'auteur ggarciao
Cela a fonctionné pour moi, lors de la sérialisation d'une classe où je ne pouvais pas utiliser les annotations (
LogRecord
):OriginalL'auteur Alex R