Spring schemaLocation falha quando não há conexão com a Internet


107

Estou usando o Spring e application-context.xmltenho as seguintes definições:

<?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"
   >

.....

Quando minha conexão com a Internet é perdida, não consigo executar meu aplicativo via Tomcat ou Jetty.

Dá:

[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........

Alguma sugestão de como consertar isso?

Respostas:


115

Não há necessidade de usar o classpath: protocol em seu schemaLocation URL se o namespace estiver configurado corretamente e o arquivo XSD estiver em seu classpath.

Spring doc " Registrando o manipulador e o esquema " mostra como isso deve ser feito.

No seu caso, o problema provavelmente era que o jar do contexto do spring em seu classpath não era 2.1. É por isso que alterar o protocolo para classpath: e colocar o XSD 2.1 específico em seu classpath corrigiu o problema.

Pelo que tenho visto, existem 2 esquemas definidos para o XSD principal contido em um spring- * jar. Uma vez para resolver o URL do esquema com a versão e uma vez sem ela.

Como exemplo, veja esta parte do conteúdo de spring.schemas em 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

Isso significa que (em 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 

no caminho de classe.

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

ou

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

será validado contra

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

no caminho de classe.

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

não está definido, então Spring irá procurá-lo usando a URL literal definida em schemaLocation.


37
Para aqueles que precisam de um resumo: O Spring não consegue encontrar os esquemas no classpath. O Spring core JAR tem um esquema-> mapeamento de nome de arquivo que está incluído no JAR. Se não conseguir resolver isso, irá para a web.
Alex

Eu declarei assim "http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd". Eu tenho o jar 4.0 no Glassfish / domains / domain1 / lib. Sempre que implanto o projeto, glassfish se refere à internet. Este problema é específico do glassfish-4.0? (adicionado mais '/' s para formatação)
Pragalathan M

Acho que o novo link "Registrando o manipulador e o esquema" deveria estar aqui: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@Dirk - esse link parece estar quebrado
Stormcloud

2
@Stormcloud, sim, o link original parece estar de volta e o que sugeri quebrado. Aqui está o link do documento mais recente: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

Eu resolvi isso

<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.xsdé a chave para trabalhar no modo offline (sem conexão com a Internet). Também copiei spring-context-2.1.xsdpróximo ao (mesmo diretório) o arquivo application-context.xml


6
Para usuários de intellij que podem ter isso. Isso funciona mesmo que o intellij não reconheça a sintaxe do classpath dentro do schemalLocation e a destaque como um erro.
Upgradingdave

Muito obrigado, @DaveParoulek - o erro estava me confundindo, mas isso resolveu o problema.
Zach Johnson

18

Algo assim funcionou para mim.

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
Sim, isso funciona porque o xsd é embalado dentro do jarro de primavera. Portanto, não há necessidade de verificar em springframework.com quando você pode usar o xsd dentro do jar :)
Somaiah Kumbera

Esta solução funcionou para mim porque eu tinha as dependências de mola dentro de uma jarra, ou seja, como uma jarra externa e sem falha de internet sua solução funcionou muito bem para mim, muito obrigado a Deus.
chiperortiz

@godlikeNoob Eu tentei isso, mas está dando novamente o erro "cvc-elt.1: Não é possível encontrar a declaração do elemento 'beans'."
Kamini

6

Caso alguém chegue aqui através da mesma raiz que eu - encontrei este problema porque estava construindo um único JAR com todas as dependências, incluindo Spring JARs. Como resultado, o arquivo spring.schemas em alguns dos diretórios META-INF de Spring JARs foi sobrescrito.

Encontrei soluções sugeridas aqui: Como criar um jar executável baseado em spring com o maven?


5

Tive um problema semelhante hoje. No meu caso, foi o plugin de sombra o culpado, além de springframework.org ter uma falha. O seguinte snippet esclareceu as coisas:

<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 alguém


onde o snippet acima precisa ser adicionado?
Kamini

4

Você deve verificar se os arquivos spring.handlerse spring.schemasestão no caminho de classe e se têm o conteúdo correto.

Isso pode ser feito com ClassLoader.getResource(..). Você pode executar o método com um depurador remoto no ambiente de tempo de execução. A configuração de criação XML extensível é descrita em Spring Reference B.5. Registrando o manipulador e o esquema .

Normalmente, os arquivos devem estar no jar do spring (springframework.jar / META-INF /) e no classpath quando o Spring pode ser iniciado.


1
oi, sua solução é muito complexa; eu não entendo o que você quer dizer? jroller.com/marshbourdon/entry/using_spring_2_x_xml , tentei fazer isso, mas não funciona. Alguma sugestão ? Não poderia ser complexo trabalhar com um webapp sem conexão com a Internet. Estou certo ? Obrigado.
Altug de

1
A primavera deve funcionar fora da caixa. Algo com seu classpath está incorreto. Minha resposta continha apenas algumas dicas para analisar seu problema.
Thomas Jung de

2

Encontre o caminho da aula

Se você estiver usando o eclipse, clique no arquivo jar correspondente. Vá para -> META-INF-> abrir o arquivo spring.schemas

você verá as linhas mais ou menos como abaixo.

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

copie após = e configure os beans como a seguir.

<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">


Fiz essa alteração no xml springframework.org/schema/rabbit classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd, mas diz Falha ao ler documento de esquema 'classpath: org / springframework / amqp / coelho / config / spring-rabbit-1.6.xsd '? qualquer sugestão
Lalit Mehra

1

Você precisa adicionar localizações de esquema à sua definição de bean, e então eles podem ser encontrados no classpath em vez de buscados pela rede. Dados seus problemas de formatação, não tenho 100% de certeza de que você ainda não está fazendo isso.

<?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

Resolvemos o problema fazendo isso:

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");

Observe que nosso aplicativo é um aplicativo off-line independente Java.


1

Se você estiver usando o eclipse para seu desenvolvimento, será útil instalar o plugin STS para Eclipse [do marketPlace para a versão específica do eclipse.

Agora, quando você tenta criar um novo arquivo de configuração em uma pasta (normalmente recursos) dentro do projeto, as opções seriam uma "Pasta Spring" e você pode escolher uma opção "Arquivo de definição do Spring Bean" Spring> Arquivo de configuração do Spring Bean.

Com essa opção selecionada, ao seguir as etapas, ele pede que você selecione os namespaces e as versões específicas:

E assim a possibilidade de ter um jar ou versão antiga inexistente pode ser eliminada.

Também teria postado imagens, mas minha reputação é muito baixa .. :(


1

O problema está nos arquivos JAR usados ​​em seu aplicativo.

O que eu fiz, que funcionou, foi entrar nos JARs para SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT, SPRING-TX que combinam com a versão que estou usando. Dentro da pasta META-INF, concatenei todos os spring.handlers e spring.schemas que vêm nesses JARs.

Matei dois coelhos com uma cajadada só, resolvi o problema dos esquemas para que funcione corretamente no modo offline.

PS Eu tentei o plugin maven para SHADE e os transformadores, mas não funcionou.


Como você resolveu esse problema, pode me ajudar a entender isso. Eu estou precisando
Kamini

1

Eu tive esse problema. Para a posteridade, minha exceção foi:

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'

Eu resolvi isso quando percebi que a versão do spring-beansespecificado em meu Maven pom.xmlera 4.1.x, o que significa que o específico .xsdnão pôde ser encontrado no caminho de classe.

Isso foi mascarado por um longo tempo porque normalmente estou online, então pensei que estar offline tinha "quebrado" a compilação. Mas realmente não teve nada a ver com isso. Atualizar o meu pom.xmlpara especificar a versão correta do spring-beans, ou seja 4.2.x, corrigi- lo.


1

Tive o mesmo problema ao usar o spring-context versão 4.0.6 e o ​​spring-security versão 4.1.0.

Ao alterar a versão do spring-security para 4.0.4 (porque 4.0.6 do spring-security não está disponível) em meu pom e security xml -> schemaLocation, ele é compilado sem internet.

Isso significa que você também pode resolver isso:

  • alterando spring-security para uma versão mais antiga ou igual à do spring-context.

  • alterando spring-context para uma versão mais recente ou igual à do spring-security.

(qualquer forma de spring-context ser mais recente ou a mesma versão do spring-security)


0

Eu gostaria de acrescentar algum aspecto adicional a essa discussão. No sistema operacional Windows, observei que quando um arquivo jar contendo um esquema é armazenado em um diretório cujo caminho contém um caractere de espaço, por exemplo, como no exemplo a seguir

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

então, especificar o URL do local do esquema da seguinte maneira não é suficiente quando você está desenvolvendo algum aplicativo independente que deve funcionar também offline

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

Eu aprendi que o resultado dessa resolução de URL de localização de esquema é um arquivo que tem um caminho como o seguinte

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

Quando iniciei meu aplicativo em algum outro diretório que não continha caracteres de espaço em seu caminho, a resolução de localização do esquema funcionou bem. Talvez alguém tenha enfrentado problemas semelhantes? No entanto, descobri que o protocolo do classpath funciona bem no meu caso

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

0

Eu tinha enfrentado esse problema semelhante também. No meu caso, minha resolução é bem diferente. Este é meu arquivo 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">
...

Não estou especificando nenhuma versão do xsd, pois quero que o spring use a versão mais recente do xsd dentro das dependências do spring. A versão spring que meu aplicativo usou foi spring-beans-4.3.1.RELEASE.jar: 4.3.1.RELEASE e quando eu montei meu aplicativo em jar, todas as dependências de spring existem em meu classpath. No entanto, recebi o seguinte erro durante a inicialização do meu contexto de aplicativo Spring:

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>.

Depois de um tempo difícil para solucionar o problema, descobri que o problema se deve ao index.list dentro da pasta META-INF do meu arquivo jar. Com o arquivo index.list , os manipuladores de namespace spring não podem ser localizados para analisar o xml de contexto do aplicativo spring corretamente. Você pode ler mais sobre esta edição da primavera SPR-5705

Removendo a indexação do meu plug-in maven-jar , consigo resolver o problema. Espero que isso economize algum tempo para pessoas com o mesmo problema.


0

Apenas certifique-se de que o arquivo jar do Spring relevante esteja em seu classpath de runtime. No meu caso, faltava spring-tx-4.3.4.RELEASE.jar do classpath de tempo de execução. Depois de adicionar este jar, o problema foi resolvido.


0

Se não houver conexão com a Internet em sua plataforma e você usar o Eclipse, siga estas etapas (isso resolve meu problema)

  1. Encontre os arquivos xsd exatos (você pode descompactar esses arquivos de seus jars. Por exemplo, spring-beans-xyxsd em spring-beans-xyzRELEASE.jar)
  2. Adicione esses arquivos xsd ao Catálogo XML do Eclipse. (Preferências-> XML-> Catálogo XML, Adicionar arquivos)
  3. Adicione a localização desses arquivos ao arquivo de configuração. (Tenha cuidado, escreva a versão exata do arquivo)

Exemplo:

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


-1

Remova os jars que você adicionou recentemente no web-inf -> lib. por exemplo jars jstl.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.