Je suis confronté à un problème étrange lors de la validation d'un XML avec un XSD très basique. Le JDK 1.6 et 1.7 JDK de comportement ne sont pas les mêmes ...Échec de validation dans JDK 1.6, succès dans JDK 1.7
Voici mon schéma:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Salaries" type="SalariesType">
<xs:unique name="Salary-Ctrl">
<xs:selector xpath="Salary" />
<xs:field xpath="@institutionIDRef" />
<xs:field xpath="Code" />
</xs:unique>
</xs:element>
<xs:complexType name="SalariesType">
<xs:sequence>
<xs:element name="Salary" type="SalaryType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="SalaryType">
<xs:sequence>
<xs:element name="ValidAsOf" type="xs:date" minOccurs="0" />
<xs:element name="Code" type="xs:string" minOccurs="0" />
<xs:element name="AnnualBasis" type="xs:string" />
</xs:sequence>
<xs:attribute name="institutionIDRef" type="xs:string" use="required" />
</xs:complexType>
</xs:schema>
Et voici mon XML:
<Salaries>
<Salary institutionIDRef="someID">
<AnnualBasis>someContent</AnnualBasis>
</Salary>
</Salaries>
Pour la validation, j'utilise cette simple morceau de programme:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new SAXSource(new InputSource(new ByteArrayInputStream(xsd.getBytes()))));
Validator validator = schema.newValidator();
validator.validate(new SAXSource(new InputSource(new ByteArrayInputStream(xml.getBytes()))));
System.out.println("Validated !");
Si je lance simplement ce morceau de code avec le JDK 1.7, il n'y a pas d'erreur et le X ML est validé (et donc avec le JDK 1.5). Toutefois, dans le JDK 1.6 Je l'exception suivante:
Exception in thread "main" org.xml.sax.SAXParseException: Not enough values specified for <unique> identity constraint specified for element "Salaries".
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ValueStoreBase.endValueScope(XMLSchemaValidator.java:3463)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endValueScopeFor(XMLSchemaValidator.java:1479)
at com.sun.org.apache.xerces.internal.impl.xs.identity.Selector$Matcher.endElement(Selector.java:235)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2169)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.validate(ValidatorHandlerImpl.java:700)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:97)
at javax.xml.validation.Validator.validate(Validator.java:127)
at ch.Test.main(Test.java:53)
Comment puis-je faire le validateur accepter cela dans JDK 1.6?
Merci & Cordialement
Bonjour et merci pour la réponse. Malheureusement je suis incapable de le faire facilement parce que la validation est faite en souterrain en invoquant un webservice (en fait le marshalling échoue). Je suppose que la solution facile serait de passer à JDK 1.7 et d'utiliser l'option -source 1.6 dans mon environnement JavaEE6 ... – ctabin