2011-05-05 5 views
1

Condition: le service basé sur CXF reçoit une demande/réponse avec des données, ce qui enfreint la restriction XSD.Comment récupérer le nom du champ en cas d'erreur de non-mémorisation dans CXF?

Comportement réel: Dans ce cas CXF retourne défaut avec le message comme:

cvc-maxLength valide: Valeur 'string_length_violated_value' avec = longueur '28' est pas facette valide en ce qui concerne maxLength '13' pour le type 'XSDStringTypeWithLengthRestriction'

Objectif: faute de retour au consommateur avec le nom du champ qui contient des données non valides. F.e. quelque chose comme ceci:

Réponse du fournisseur contient des données non valides. La valeur 'string_length_violated_value' du champ 'field_name' n'a pas de facette valide par rapport à maxLength '13'.

Je me demande si c'est possible et si oui, alors comment déterminer (où récupérer) ce nom de champ?

+0

Je viens de rencontrer un problème similaire, où j'obtiens une erreur Unmarshalling "non valide" mais sans aucun indice sur l'élément en question, à l'exception de la "valeur fautive". Comme j'ai des centaines d'éléments dans le message XML, c'est comme chercher une aiguille dans une botte de foin. Ma solution de contournement pour cette étape est de fournir des valeurs uniques (fausses) pour chaque élément et puisque les valeurs (mais pas les éléments) sont signalées, cela me renvoie à l'élément approprié. C'est ennuyeux et pas très intelligent, cependant. Je vais essayer la technique 'JAXB ValidationEventHandler' une fois que j'ai un peu plus de temps. – Withheld

+0

Salut Daniel, beaucoup de temps passé donc je ne me souviens pas détaillé, désolé. Mais ce que je peux dire - pour moi, 'ValidationEventHandler' n'a pas fonctionné, car la version de cxf que nous avions utilisée l'a ignoré. C'est une mauvaise nouvelle, mais il y a aussi du bon - j'ai réussi à obtenir des données sur "coordonnées" (numéro de ligne et de colonne) de la faille cxf en creusant dans des objets encapsulés - c'était notre solution. – Milkywayfarer

Répondre

2

Je ne sais pas si cela fonctionnera complètement, mais vous pouvez essayer:

Vous pouvez créer un ValidationEventHandler JAXB et inscrivez-vous que sur votre terminal. Le ValidationEvent qu'il obtient a la chaîne de base (que vous voyez ci-dessus) et d'autres informations. Je voudrais mettre un point d'arrêt là-bas et creuser dans l'événement pour voir si des informations supplémentaires et utiles sont disponibles.

+0

merci beaucoup je vais essayer et informer si cela apportera un résultat! – Milkywayfarer

+0

Malheureusement, [cette source] (http://stackoverflow.com/a/10227684/1864054) indique que [ValidationEventHandler] (https://jaxb.java.net/jaxb20-ed/api/javax/xml/bind/ ValidationEventHandler.html) ne vous laissera pas modifier le comportement de réponse et vous ne pouvez pas changer le format de réponse SOAP. Est-ce vrai? – Withheld

Questions connexes