Spring 3.0: 找不到用于XML模式命名空间的Spring NamespaceHandler

38

我的设置非常简单:我有一个Web前端,后端是Spring-wired。

我正在使用AOP为我的rpc服务添加一层安全性。

一切都很好,除了Web应用程序启动时中止的事实:

  [java] SEVERE:上下文初始化失败
     [java] org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:无法找到用于XML模式名称空间[http://www.springframework.org/schema/aop]的Spring NamespaceHandler
     [java] 违规资源:ServletContext资源[/ WEB-INF / gwthandler-servlet.xml]

这是我xml配置文件的片段:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <aop:config>
        <aop:aspect id="security" ref="securityAspect" >
            <aop:pointcut id="securedServices" expression="@annotation(com.fb.boog.common.aspects.Secured)"/>
            <aop:before method="checkSecurity" pointcut-ref="securedServices"/>
        </aop:aspect>
    </aop:config>

我在互联网上读到可能是我的类加载造成了问题。不过我有些怀疑,因为这里是我的WEB-INF/lib目录:

./WEB-INF/lib
./WEB-INF/lib/aopalliance-alpha1.jar
./WEB-INF/lib/aspectj-1.6.6.jar
./WEB-INF/lib/commons-collections.jar
./WEB-INF/lib/commons-logging.jar
./WEB-INF/lib/ehcache-core-1.7.0.jar
./WEB-INF/lib/ejb3-persistence.jar
./WEB-INF/lib/hibernate
./WEB-INF/lib/hibernate/antlr.jar
./WEB-INF/lib/hibernate/asm.jar
./WEB-INF/lib/hibernate/bsh-2.0b1.jar
./WEB-INF/lib/hibernate/cglib.jar
./WEB-INF/lib/hibernate/dom4j.jar
./WEB-INF/lib/hibernate/freemarker.jar
./WEB-INF/lib/hibernate/hibernate-annotations.jar
./WEB-INF/lib/hibernate/hibernate-shards.jar
./WEB-INF/lib/hibernate/hibernate-tools.jar
./WEB-INF/lib/hibernate/hibernate.jar
./WEB-INF/lib/hibernate/jtidy-r8-20060801.jar
./WEB-INF/lib/jabsorb
./WEB-INF/lib/jabsorb/jabsorb-1.3.1.jar
./WEB-INF/lib/jta.jar
./WEB-INF/lib/jyaml-1.3.jar
./WEB-INF/lib/postgresql-8.4-701.jdbc4.jar
./WEB-INF/lib/sjsxp.jar
./WEB-INF/lib/spring
./WEB-INF/lib/spring/org.springframework.aop-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.asm-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.aspects-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.beans-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.context-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.context.support-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.core-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.expression-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.instrument-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.instrument.tomcat-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.jdbc-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.jms-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.orm-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.oxm-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.test-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.transaction-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.web-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.web.portlet-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.web.servlet-3.0.0.RELEASE.jar
./WEB-INF/lib/spring/org.springframework.web.struts-3.0.0.RELEASE.jar
./WEB-INF/lib/testng-5.11-jdk15.jar
./WEB-INF/web.xml
11个回答

48

在使用maven-shade-plugin时遇到了这个错误,解决方法是在构建过程中包含:

META-INF/spring.schemas

META-INF/spring.handlers

转换器(transformers)。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>

(来源: 避免在将多个Spring依赖合并到单个jar文件时覆盖spring.handlers/spring.schemas的想法)


这对我来说也是如此。作为参考,我正在构建一个基于Maven原型Camel Spring DSL的独立Apache Camel路由。 - Miguel Coquet

16

与汇编插件相关的错误中的一条评论指向了shade插件的工作。我转换到了shade插件,很快就让所有东西重新运行起来了。http://jira.codehaus.org/browse/MASSEMBLY-360 - digitaljoel

12
你在使用什么IDE(如果有的话)?这种情况是在IDE内工作时发生还是只在部署时发生?如果是部署问题,可能是因为你使用的任何部署机制——例如maven-assembly制作一个包含所有依赖项的单个JAR文件 已成为众所周知的罪魁祸首——将所有JAR文件折叠到一个目录中,Spring架构和处理程序文件互相覆盖。

使用IntelliJ作为IDE。IDE没有问题,一切正常。我正在使用ant来组装Web应用程序,上面的列表来自war目录。 - Nick Hristov
+1 给 delfuego,因为他链接了 MASSEMBLY-360;那正是我遇到的问题。 - Andrew Swan
1
如果使用Spring 2.5.6版本,您可以通过使用随附该版本的全能型“spring” JAR文件来解决此问题(而不是分别使用spring-core、spring-beans、spring-jdbc等)。 - Andrew Swan
这个问题有没有简单的解决方法? - DD.
给delfuego和Andrew Swan加一分。大约在2012年,我也遇到了同样的问题。 - sparc_spread
根据讨论中的建议,@DD。一个解决方案可能是使用可作为Maven插件使用的one-jar库。对我来说有效。 - Giulio Piancastelli

9

你是否尝试将所有的jar文件直接放在WEB-INF/lib目录中,而不是其子目录下?

例如:WEB-INF/lib/spring/org.springframework.aop-3.0.0.RELEASE.jar应该改为WEB-INF/lib/org.springframework.aop-3.0.0.RELEASE.jar

其他的jar文件也同理。


是的 - 根据这个,WEB-INF/lib下的子目录是无效的。以前不知道它是如何工作的...现在知道了,真好。http://code.google.com/appengine/docs/java/tools/ant.html#Copying_JARs - delfuego
顺便说一下,我怀疑它在IntelliJ中正常工作的原因是IntelliJ正在使用自定义类加载器... - delfuego
1
是的,问题已经解决了。IntelliJ不会抱怨,因为它直接在库部分添加了这些jar包。 - Nick Hristov
还有一件需要注意的事情,Ant的复制任务具有“flatten”参数,非常适合这个任务。 - Nick Hristov
一旦类位于类路径中,只要包名称正确,所有类都应该可用。文件夹名称不应该有影响。所以这是IDE的问题...如果我错了,请提出建议。 - Punith Raj
请参考以下链接了解详细信息: http://www.baeldung.com/unable-to-locate-spring-namespacehandler-for-xml-schema-namespace - Atul

1

我遇到了类似的错误,但是是在新创建的Roo项目中涉及Spring Webflow。对我来说解决方案是(项目)/右键单击/Maven/启用Maven依赖项(然后进行一些重启和重新发布到Tomcat)。看起来STS或m2Eclipse未能将所有spring webflow jar文件推送到Web应用程序lib目录中。我不确定为什么。但启用maven依赖项处理,然后重新构建似乎可以解决问题;webflow jar文件最终被发布,因此它可以找到模式命名空间引用。

我通过探索Web应用程序发布到的tomcat目录,点击WEB-INF/lib/,同时运行并注意到缺少webflow jar文件来调查这个问题。


1
这个技巧对我也起作用了:在Eclipse中右键单击项目,然后选择Maven > 更新依赖项。

0

我也遇到了Spring 3.0.2和spring-beans-3.0.xsd的同样问题。

我的解决方案:

在源文件夹中创建一个名为META-INF/spring.schemas的文件,并复制所有必要的定义。同时创建spring.handlers。

我认为PluggableSchemaResolver类没有正常工作。

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/xml/PluggableSchemaResolver.html

从javadoc中:

“默认情况下,此类将使用模式:META-INF/spring.schemas在类路径中查找映射文件,允许多个文件同时存在于类路径中。”

但在我的情况下,这个类只读取了找到的第一个spring.schemas。

Grettings. pacovr


在编程方面的内容,将以下内容从英语翻译成中文。只有提到PluggableSchemaResolver才能获得+1分。这里有一篇关于此主题的好文章:http://denis-zhdanov.blogspot.com/2010/01/spring-xsd-loading-algorithm.html - opyate
是的,谢谢。将所有META-INF/spring.schemas(同样适用于META-INF/spring.handlers)合并在所有Spring JAR中对我来说是解决方案。 - wxl24life

0
如果有其他人遇到这个问题,我刚刚使用Eclipse解决了它;通过右键单击操作运行项目。这个错误发生在J2EE视图中,但在Java视图中没有发生。不确定 - 假设是将库添加到正确的“lib”目录中的某些问题。
我还使用Maven项目,允许m2eclipse管理依赖项。

0

确保您已解决所有依赖项

在我的第一次尝试AOP时,我遇到了这个问题,当时我正在跟随一个Spring教程。 我的问题是没有将spring-aop.jar添加到我的类路径中。该教程列出了我必须添加的所有其他依赖项,即:

  • aspectjrt.jar
  • aspectjweaver.jar
  • aspectj.jar
  • aopalliance.jar

但是那个丢失了。这是原问题中可能导致该症状的另一个问题。

我正在使用Eclipse(neon),Java SE 8,beans 3.0,spring AOP 3.0,Spring 4.3.4。该问题显示在Java视图中--而不是JEE--,并且尝试使用右键菜单- >运行为 -> Java应用程序来运行应用程序时出现。


0
如果使用mvn,请检查您在pom.xml中是否有正确的范围(如果您已定义)。我曾经将其错误地设置为test,但需要它用于runtime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接