java - SAXParseException; src-resolve: no se puede resolver el nombre ''...'' a un componente(n) ''definiciĆ³n de tipo''
xml spring (4)
Estoy intentando hacer una validación de esquema, actualmente usando javax.xml.validation.SchemaFactory
. Desafortunadamente cuando llamo a la función newSchema(Source schema)
, newSchema(Source schema)
el siguiente error:
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
La utility:ObjectStatusDateType
elemento utility:ObjectStatusDateType
se usa en el archivo .xsd que paso a la función newSchema(Source schema)
. Estoy importando ObjectStatusDateType
desde otro archivo .xsd, para el cual he comprobado por tripple la ruta del archivo. El espacio de nombres de la utility
también se declara correctamente.
Aquí hay un fragmento del esquema que paso a la función (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"/>
Y esto es 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>
Y, por último, el frijol
<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>
¿Alguien ha encontrado este tipo de problema antes?
Mucha gente se ha encontrado con este tipo de problema antes. Aparece cada vez que su validador, por cualquier razón, no carga los documentos de esquema que desea cargar (y piensa que se está cargando).
Para confirmar el diagnóstico: intente introducir un error, por ejemplo, un error de buena formación, en ObjectHistory_1_0.xsd y vea si el sistema se queja.
He tenido este problema antes. Todo validado en Eclipse, pero se rompió durante la ejecución. ¿Alguno de sus esquemas importa más de un esquema en el mismo espacio de nombres?
Algo como esto no funcionará, pero será validado por Eclipse:
<import namespace="http://www.whatever.gov" location="../wherever" />
<import namespace="http://www.whatever.gov" location="../folder/superawesomeschema.xsd" />
Usando Xerces esto puede resolverse estableciendo la característica http://apache.org/xml/features/honour-all-schemaLocations
en true.
La función http://apache.org/xml/features/honour-all-schemaLocations
solo está disponible en Xerces 2.7.0. Las versiones actuales de Java 5.0 y 6.0 tienen incorporado un Xerces 2.6.2. Por lo tanto, uno tiene que usar una biblioteca Xerces más nueva para que esto funcione, es decir. copiando xml-apis.jar
y xercesImpl.jar
a <jdk-home>/jre/lib/endorsed
jaxp.properties
y creando un archivo jaxp.properties
en <jdk-home>/jre
contiene la línea
javax.xml.validation.SchemaFactory/:http/://www.w3.org/2001/XMLSchema=org.apache.xerces.jaxp.validation.XMLSchemaFactory
Tuve el mismo problema al ejecutar el complemento maven jaxb2-maven-plugin. Después de mencionar explícitamente el archivo xsd para analizar, funcionó como un amuleto:
<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>