Spring schemaLocation falla cuando no hay conexión a Internet


107

Estoy usando Spring y application-context.xmltengo las siguientes definiciones:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://www.springframework.org/schema/util 
   http://www.springframework.org/schema/util/spring-util-2.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-2.1.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   http://www.springframework.org/schema/security
   http://www.springframework.org/schema/security/spring-security-2.0.xsd"
   >

.....

Cuando se pierde la conexión a Internet, no puedo ejecutar mi aplicación a través de tomcat o jetty.

Da:

[main] WARN  org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document '/spring-beans-2.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:96)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2541)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaWarning(XSDHandler.java:2532)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1836)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:2408)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1753)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    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:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    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:107)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:115)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:441)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:383)
    at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210)
    at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184)
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
2009-11-13 15:31:25,675 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 23 in XML document from class path resource [application-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinit........

¿Alguna sugerencia de cómo solucionarlo?

Respuestas:


115

No es necesario utilizar el protocolo classpath: en su URL de schemaLocation si el espacio de nombres está configurado correctamente y el archivo XSD está en su classpath.

Spring doc " Registrar el controlador y el esquema " muestra cómo se debe hacer.

En su caso, el problema probablemente fue que el contenedor de contexto de primavera en su ruta de clases no era 2.1. Por eso, cambiar el protocolo a classpath: y poner el XSD 2.1 específico en su classpath solucionó el problema.

Por lo que he visto, hay 2 esquemas definidos para el XSD principal contenido en un spring- * jar. Una vez para resolver la URL del esquema con la versión y una vez sin ella.

Como ejemplo, vea esta parte del contenido de spring.schemas en spring-context-3.0.5.RELEASE.jar:

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd

Esto significa que (en xsi: schemaLocation)

http://www.springframework.org/schema/context/spring-context-2.5.xsd 

será validado contra

org/springframework/context/config/spring-context-2.5.xsd 

en el classpath.

http://www.springframework.org/schema/context/spring-context-3.0.xsd 

o

http://www.springframework.org/schema/context/spring-context.xsd

será validado contra

org/springframework/context/config/spring-context-3.0.xsd 

en el classpath.

http://www.springframework.org/schema/context/spring-context-2.1.xsd

no está definido, por lo que Spring lo buscará utilizando la URL literal definida en schemaLocation.


37
Para aquellos que necesitan un resumen: Spring no puede encontrar los esquemas en la ruta de clases. El JAR principal de Spring tiene un esquema-> asignación de nombre de archivo que se incluye en el JAR. Si no puede resolver esto, irá a la web.
Alex

Lo he declarado así "http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd". Tengo el tarro 4.0 en Glassfish / domains / domain1 / lib. Siempre que implemento el proyecto, glassfish se refiere a Internet. ¿Este problema es específico de glassfish-4.0? (se agregaron más '/' para formatear)
Pragalathan M

Creo que el nuevo enlace "Registrar el controlador y el esquema" debería estar aquí: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@Dirk - ese enlace parece estar roto
Stormcloud

2
@Stormcloud, sí, el enlace original parece estar de vuelta y el que sugerí está roto. Aquí está el enlace del documento más reciente: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

Lo resolví

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-2.0.xsd
       http://www.springframework.org/schema/context
       classpath:spring-context-2.1.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-2.0.xsd"
       >

classpath:spring-context-2.1.xsdes la clave para trabajar en modo offline (sin conexión a Internet). También copié spring-context-2.1.xsdcerca (mismo directorio) del archivo application-context.xml


6
Para usuarios de intellij que puedan encontrarse con esto. Esto funciona aunque intellij no reconoce la sintaxis de classpath dentro de schemalLocation y la destaca como un error.
Actualización

Un gran agradecimiento @DaveParoulek: el error me estaba confundiendo, pero esto definitivamente funciona.
Zach Johnson

18

Algo como esto funcionó para mí.

xsi:schemaLocation=
"http://www.springframework.org/schema/beans 
             classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
             classpath:org/springframework/beans/factory/xml/spring-context-3.0.xsd"

1
Sí, esto funciona porque el xsd está empaquetado dentro del frasco de primavera. Así que no es necesario consultar springframework.com cuando puede usar el xsd dentro del frasco :)
Somaiah Kumbera

Esta solución funcionó para mí porque tenía las dependencias de primavera dentro de un frasco, quiero decir, como un frasco externo y sin fallas en Internet, su solución funcionó muy bien para mí, muchas gracias, Dios los bendiga.
chiperortiz

@godlikeNoob Intenté esto, pero vuelve a dar el error "cvc-elt.1: No se puede encontrar la declaración del elemento 'beans'".
Kamini

6

En caso de que alguien llegue aquí a través de la misma raíz que yo, encontré este problema porque estaba construyendo un solo JAR con todas las dependencias, incluidos los Spring JAR. Como resultado, se sobrescribió el archivo spring.schemas en algunos de los directorios META-INF de Spring JAR.

Encontré soluciones sugeridas aquí: ¿Cómo crear un jar ejecutable basado en primavera con maven?


5

Me encontré con un problema similar hoy. En mi caso, fue el complemento de sombra el culpable, además de que springframework.org tuvo una interrupción. El siguiente fragmento aclaró las cosas:

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
   <resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/spring.handlers</resource>
</transformer>

HTH alguien


¿Dónde debe agregarse el fragmento anterior?
Kamini

4

Debe verificar que los archivos spring.handlersy spring.schemasestén en la ruta de clases y tengan el contenido correcto.

Esto se puede hacer con ClassLoader.getResource(..). Puede ejecutar el método con un depurador remoto en el entorno de ejecución. La configuración de creación de XML extensible se describe en Spring Reference B.5. Registrar el controlador y el esquema .

Normalmente, los archivos deben estar en el jar de Spring (springframework.jar / META-INF /) y en la ruta de clase cuando se puede iniciar Spring.


1
hola, tu solución es muy compleja; no entiendo que quieres decir jroller.com/marshbourdon/entry/using_spring_2_x_xml , probé esto pero no funciona. Alguna sugerencia ? No puede ser complicado trabajar con una aplicación web sin conexión a Internet. estoy en lo cierto? Gracias.
Altug

1
La primavera debería funcionar fuera de la caja. Algo con tu classpath es incorrecto. Mi respuesta contenía solo algunas sugerencias para analizar su problema.
Thomas Jung

2

Encontrar ruta de clases

Si está utilizando eclipse, haga clic en el archivo jar correspondiente. Ir a -> META-INF-> abrir archivo spring.schemas

verá las líneas algo así como a continuación.

http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.1.xsd

copiar after = y configurar beans como se muestra a continuación.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/rabbit classpath:org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.1.xsd http://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-3.1.xsd http://www.springframework.org/schema/util classpath:org/springframework/beans/factory/xml/spring-util-3.1.xsd">


Hice este cambio en xml springframework.org/schema/rabbit classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd pero dice No se pudo leer el documento de esquema 'classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd '? cualquier sugerencia
Lalit Mehra

1

Debe agregar ubicaciones de esquema a la definición de su bean, y luego se pueden encontrar en classpath en lugar de buscarlas en la red. Dados sus problemas de formato, no estoy 100% seguro de que no lo esté haciendo ya.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- empty: the beans we use are in the base class's context. -->
</beans>

1

Resolvimos el problema haciendo esto:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false); // This avoid to search schema online
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", "TransactionMessage_v1.0.xsd");

Tenga en cuenta que nuestra aplicación es una aplicación sin conexión independiente de Java.


1

Si está utilizando eclipse para su desarrollo, es útil instalar el complemento STS para Eclipse [del marketPlace para la versión específica de eclipse.

Ahora, cuando intente crear un nuevo archivo de configuración en una carpeta (normalmente recursos) dentro del proyecto, las opciones tendrían una "Carpeta Spring" y puede elegir una opción "Archivo de definición Spring Bean" Spring> Spring Bean Configuation File.

Con esta opción seleccionada, cuando sigue los pasos, le pide que seleccione los espacios de nombres y las versiones específicas:

Y así se puede eliminar la posibilidad de tener un jar inexistente o una versión antigua.

También habría publicado imágenes, pero mi reputación es bastante baja .. :(


1

El problema radica en los archivos JAR que usa en su aplicación.

Lo que hice, que funcionó, fue meterme en los JARs para SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT, SPRING-TX que coinciden con la versión que estoy usando. Dentro de la carpeta META-INF, concatené todos los spring.handlers y spring.schemas que vienen en esos JAR.

Maté dos pájaros de un tiro, resolví el problema de los esquemas para que esto también funcione correctamente en modo offline.

PD: Probé el complemento maven para SHADE y los transformadores, pero no funcionó.


¿Cómo resolvió este problema? ¿Puede ayudarme a entenderlo? Estoy en necesidad
Kamini

1

Tuve este problema. Para la posteridad, mi excepción fue:

org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 117;
schema_reference.4: Failed to read schema document
'http://www.springframework.org/schema/beans/spring-beans-4.2.xsd'

Lo resolví cuando me di cuenta de que la versión de spring-beansespecificada en mi Maven pom.xmlera 4.1.x, es decir, la versión específica.xsd no se podía encontrar en el classpath.

Esto estuvo enmascarado durante mucho tiempo porque normalmente estoy en línea, así que pensé que estar fuera de línea había "roto" la compilación. Pero realmente no tuvo nada que ver con eso. Actualizar my pom.xmlpara especificar la versión correcta de spring-beans, es decir 4.2.x, lo solucionó.


1

Tuve el mismo problema cuando estoy usando Spring-context versión 4.0.6 y Spring-Security versión 4.1.0.

Al cambiar la versión de spring-security a 4.0.4 (porque 4.0.6 de spring-security no está disponible) en mi pom y security xml -> schemaLocation, se compila sin Internet.

Eso significa que también puede resolver esto de la siguiente manera:

  • cambiando spring-security a una versión anterior o la misma que spring-context.

  • cambiando spring-context a una versión más nueva o la misma que spring-security.

(de cualquier forma spring-context sea más reciente o la misma versión que spring-security)


0

Me gustaría agregar algún aspecto adicional de esta discusión. En el sistema operativo Windows, he observado que cuando un archivo jar que contiene un esquema se almacena en un directorio cuya ruta contiene un carácter de espacio, por ejemplo, como en el siguiente ejemplo

"c:\Program Files\myApp\spring-beans-4.0.2.RELEASE.jar"

luego, especificar la URL de ubicación del esquema de la siguiente manera no es suficiente cuando está desarrollando alguna aplicación independiente que debería funcionar también sin conexión

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

He aprendido que el resultado de dicha resolución de URL de ubicación de esquema es un archivo que tiene una ruta como la siguiente

"c:\Program%20Files\myApp\spring-beans-4.0.2.RELEASE.jar"

Cuando inicié mi aplicación desde algún otro directorio que no contenía caracteres de espacio en su ruta, la resolución de la ubicación del esquema funcionó bien. ¿Quizás alguien enfrentó problemas similares? Sin embargo, descubrí que el protocolo classpath funciona bien en mi caso

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

0

También me había encontrado con este problema similar. En mi caso, mi resolución es bastante diferente. Aquí está mi archivo xml de contexto de primavera:

...
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">
...

No estoy especificando ninguna versión xsd ya que quiero que Spring use la última versión xsd dentro de las dependencias de Spring. La versión de primavera que usó mi aplicación fue spring-beans-4.3.1.RELEASE.jar: 4.3.1.RELEASE y cuando ensamblo mi aplicación en jar, todas las dependencias de primavera existen en mi classpath. Sin embargo, recibí el siguiente error durante el inicio de mi contexto de aplicación de primavera:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

Después de un tiempo de resolución de problemas, descubrí que el problema se debe al index.list dentro de la carpeta META-INF de mi archivo jar. Con el archivo index.list , los controladores del espacio de nombres Spring no se pueden ubicar para analizar correctamente el xml del contexto de la aplicación Spring. Puedes leer más sobre este número de primavera. SPR-5705

Al eliminar la indexación de mi maven-jar-plugin , logro resolver el problema. Espero que esto ahorre algunas veces a personas que tienen el mismo problema


0

Solo asegúrese de que el archivo jar de primavera relevante esté en su ruta de clase de tiempo de ejecución. En mi caso, nos faltaba spring-tx-4.3.4.RELEASE.jar de classpath en tiempo de ejecución. Después de agregar este frasco, se resolvió el problema.


0

Si no hay conexión a Internet en su plataforma y usa Eclipse, siga estos pasos (resuelve mi problema)

  1. Busque los archivos xsd exactos (puede descomprimir estos archivos de sus frascos. Por ejemplo, spring-beans-xyxsd en spring-beans-xyzRELEASE.jar)
  2. Agregue estos archivos xsd al catálogo XML de Eclipse. (Preferencias-> XML-> Catálogo XML, Agregar archivos)
  3. Agregue la ubicación de estos archivos al archivo de configuración. (Cuidado, escribe la versión exacta del archivo)

Ejemplo:

xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-xyxsd "


-1

Elimine los archivos jar que agregó recientemente en web-inf -> lib. por ejemplo, jstl jars.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.