web-dev-qa-db-fra.com

SAXParseException; src-resolver: impossible de résoudre le nom '...' en composant a(n) 'définition de type'

J'essaie de faire la validation du schéma, en utilisant actuellement un javax.xml.validation.SchemaFactory. Malheureusement, lorsque j'appelle la fonction newSchema(Source schema), j'obtiens l'erreur suivante:

Caused by: org.xml.sax.SAXParseException; systemId: file:/C:/Users/C42056/Documents/workspace-sts-3.2.0.RELEASE/cec-sample-ws-integration-2-war/target/classes/WEB-INF/schemas/xsd/individual/PrivateComponentTypes_4_0.xsd; lineNumber: 33; columnNumber: 88; src-resolve: Cannot resolve the name 'utility:ObjectStatusDateType' to a(n) 'type definition' component.
at org.Apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.Apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.Apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDHandler.getGlobalDecl(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseNamedElement(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseLocal(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDHandler.traverseLocalElements(Unknown Source)
at org.Apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
at org.Apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
at org.Apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.Apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.Apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
at com.sei.ec.xml.validation.SimpleXmlValidator.loadSchema(SimpleXmlValidator.Java:70)
at com.sei.ec.xml.validation.SimpleXmlValidator.<init>(SimpleXmlValidator.Java:83)
... 75 more

L'élément utility:ObjectStatusDateType Est utilisé dans le fichier .xsd que je passe dans la fonction newSchema(Source schema). J'importe le ObjectStatusDateType d'un autre fichier .xsd - pour lequel j'ai triplement vérifié le chemin du fichier. L'espace de noms utility est également déclaré correctement.

Voici un extrait du schéma que je passe dans la fonction (LocateCoverageIndexesByIdentifier_3_0.xsd):

<xs:import namespace="http://www.sei.com/utility/1/" schemaLocation="../../utility/InvocationOutcome_1_0.xsd"/>
<xs:import namespace="http://www.sei.com/utility/1/" schemaLocation="../../utility/ObjectHistory_1_0.xsd"/>
<xs:import namespace="http://www.sei.com/individual/component/4/" schemaLocation="../PrivateComponentTypes_4_0.xsd"/>
<xs:import namespace="http://www.sei.com/individual/shared/5/" schemaLocation="../IndividualTypes_5_0.xsd"/>
.
. <!-- Some more stuff -->
.
<xs:element name="coveragePeriod" 
            type="utility:ObjectStatusDateType" 
            minOccurs="0"/>

Et cela provient de ObjectHistory_1_0.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:tns="http://www.sei.com/utility/1/" 
           targetNamespace="http://www.sei.com/utility/1/" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified" 
           version="1.0">
.
. <!-- Some more stuff -->
.
  <xs:complexType name="ObjectStatusDateType">
    <xs:sequence>
      <xs:element name="effectiveDate" type="xs:date"/>
      <xs:element name="cancelDate" type="xs:date" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

Et enfin, le haricot

<bean id="locateClaimValidator" 
      class="com.sei.ec.xml.validation.SimpleXmlValidator">
  <constructor-arg>
    <value>classpath:WEB-INF/schemas/xsd/individual/ci/LocateCoverageIndexesByIdentifier_3_0.xsd
    </value>
  </constructor-arg>
</bean>

Quelqu'un a-t-il déjà rencontré ce type de problème?

13
Mac

J'ai déjà eu ce problème. Tout validé dans Eclipse, mais cassé lors de l'exécution. Certains de vos schémas importent-ils plusieurs schémas dans le même espace de noms?

Quelque chose comme ça ne fonctionnera pas, mais sera validé par Eclipse:

<import namespace="http://www.whatever.gov" location="../wherever" />
<import namespace="http://www.whatever.gov" location="../folder/superawesomeschema.xsd" />
12
CSum

De nombreuses personnes ont déjà rencontré ce type de problème auparavant. Il apparaît chaque fois que votre validateur, pour une raison quelconque, ne charge pas les documents de schéma que vous souhaitez qu'il charge (et pense qu'il est en cours de chargement).

Pour confirmer le diagnostic: essayez d'introduire une erreur - disons, une erreur de bonne forme - dans ObjectHistory_1_0.xsd et voyez si le système se plaint.

6

En utilisant Xerces, cela peut être résolu en définissant la fonction http://Apache.org/xml/features/honour-all-schemaLocations à vrai.

La fonction http://Apache.org/xml/features/honour-all-schemaLocations n'est disponible qu'à partir de Xerces 2.7.0. Les versions actuelles de Java 5.0 et 6.0 ont un Xerces 2.6.2 intégré. Par conséquent, il faut utiliser une nouvelle bibliothèque Xerces pour que cela fonctionne, c'est-à-dire la copie de xml-apis.jar et xercesImpl.jar à <jdk-home>/jre/lib/endorsed et en créant un jaxp.properties fichier dans <jdk-home>/jre contenant la ligne

javax.xml.validation.SchemaFactory\:http\://www.w3.org/2001/XMLSchema=org.Apache.xerces.jaxp.validation.XMLSchemaFactory
4
Adrien Vercoutere

J'ai eu le même problème lors de l'exécution du plugin maven jaxb2-maven-plugin. Après avoir explicitement mentionné le fichier xsd à analyser, cela a fonctionné comme un charme:

<plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>jaxb2-maven-plugin</artifactId>
 <version>1.6</version>
    <executions>
     <execution>
      <id>xjc</id>
      <goals>
       <goal>xjc</goal>
      </goals>
     </execution>
    </executions>
    <configuration>
     <schemaFiles>MySchema.xsd</schemaFiles>
     <outputDirectory>src/main/Java</outputDirectory>
    </configuration>
</plugin> 
4
Aurelius Baier