J'ai un soucis et je vous demande vos lanternes, car moi je coule.
Voici une partie simplifier de mon XSD
Et voici mon code de validation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <xsd:complexType name="PersonName" abstract="true"> <xsd:sequence> <xsd:element ref="domain:Forename" minOccurs="1" maxOccurs="unbounded"/> <xsd:element ref="domain:Surname" minOccurs="1" maxOccurs="unbounded"/> <xsd:element ref="domain:SecondSurname" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="MessagePerson"> <xsd:sequence> <xsd:element name="PersonName" minOccurs="1"/> <xsd:element name="PersonSex"/> <xsd:element name="PersonBirthDate"/> </xsd:sequence> </xsd:complexType>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Message message = ... // JAXB object Validator validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI). newSchema(baseXsdLocation.getURL()) .newValidator(); validator.setErrorHandler(new MessageValidationEventHandler()); JAXBContext jc = JAXBContext.newInstance(contextPath); SAXResult result = new SAXResult(new MessageValidatingContentHandler()); validator.validate(message, result);
L'idée est de 1. valider mon objet JAXB via le validateur (ok cela fonctionne très bien), mais de 2. te capturer (et le mettre dans une liste par exemple) tout éléments erronés et naturellement aussi les éléments obligatoire.
Pour cela j'ai mis un ErrorHandler qui permet de récupérer les exceptions et un ContentHandler qui permet de savoir sur quel éléments on se trouve. Pour les éléments invalide (c-a-d les éléments existant mais dont le contenu ne sont pas bon) cela fonctionne bien. Mais pour les éléments obligatoire j'obtiens ceci en log.
Le soucis c'est que je n'arrive pas à récupérer l'élément PersonName comme étant fautif (car on est sur MessagePerson et que le PersonName est null).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ContentHandler#startElement(localName : MessagePerson) MessageValidatingContentHandler#error(cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns4:PersonSex'. One of '{"http://toto.eu/fubar/xsdFile":PersonName}'
Le moyen "facile" de récupérer l’élément manquant c'est de la manipulation de String du message d'exception... et cela je veux l'éviter
L'autre moyen c'est de commencer à utiliser de l'XPATH dans du XSD et de déterminer quel est le prochain élément obligatoire par rapport à l'élément (child ou sibling) que j'ai obtenu via le ContentHandler. Mais là j'ai déjà mal à la tête. (Car le XSD c’est un cauchemar d’abstraction et de restriction et en plus sur plusieurs fichiers XSD)
Si vous avez une belle idée à proposer je suis ouvert à toute suggestion.
Partager