【问题标题】:Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespaceSpring 3.0:无法找到 XML 模式命名空间的 Spring NamespaceHandler
【发布时间】:2010-12-28 14:37:00
【问题描述】:

我的设置相当简单:我有一个 Web 前端,后端是弹簧接线的。

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

一切都很好,除了网络应用程序在启动时中止:

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

这是我的 xml 配置文件中的 sn-p:

<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

【问题讨论】:

    标签: java spring aop


    【解决方案1】:

    在使用maven-shade-plugin时遇到这个错误,解决方法包括:

    META-INF/spring.schemas

    META-INF/spring.handlers

    构建时 maven-shade-plugin 中的转换器...

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

    (学分:Idea to avoid that spring.handlers/spring.schemas get overwritten when merging multiple spring dependencies in a single jar

    【讨论】:

    • 这也是给我的。作为参考,我正在构建一个基于 maven 原型 camel spring dsl 的独立 Apache Camel 路由。
    【解决方案2】:

    http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html

    我在使用 maven-shade-plugin 时遇到了类似的问题。我在上面的示例页面中找到了我的问题的解决方案。

    【讨论】:

    【解决方案3】:

    您使用的是什么 IDE(如果有)?当您在 IDE 中工作或仅在部署时会发生这种情况吗?如果是部署,可能是因为您使用的任何部署机制——maven-assembly 制作具有依赖关系的单个 JAR 是 a known culprit——将所有 JAR 折叠到一个目录中,并且 Spring 模式和处理程序文件正在覆盖每个其他。

    【讨论】:

    • 将 IntelliJ 用于 IDE。 IDE中没有问题,一切都检查出来了。我正在使用ant来组装web app,上面的清单来自war目录。
    • +1 到 delfuego 以链接到 MASSEMBLY-360;这正是我遇到的问题。
    • 如果使用 Spring 2.5.6,您可以使用该版本附带的一体化“spring”JAR 文件(而不是单独使用 spring-core、spring- bean、spring-jdbc 等)
    • 这个问题有简单的解决方法吗?
    • +1 给 delfuego 和 Andrew Swan。大约在 2012 年,我遇到了同样的事情。
    【解决方案4】:

    您是否尝试将所有 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

    与其他罐子相同。

    【讨论】:

    • 是的——据此,WEB-INF/lib 下的子目录无效。从来不知道一种或另一种方式是如何工作的......现在很高兴知道。 code.google.com/appengine/docs/java/tools/ant.html#Copying_JARs
    • 顺便说一句,我怀疑它在 IntelliJ 中运行良好的原因是 IntelliJ 使用了自定义类加载器...
    • 是的,解决了它。 IntelliJ 没有抱怨,因为它直接在库部分下添加了 jar。
    • 还有一点需要注意,ant的copy任务有一个“flatten”参数,非常适合这个任务。
    • 一旦类在类路径中,只要包名正确,所有类都应该可用。文件夹名称应该无关紧要。所以这是IDE的问题。如果我错了,请提出建议。
    【解决方案5】:

    我遇到了类似的错误,但在新创建的 Roo 项目中引用了 Spring Webflow。我的解决方案原来是(项目)/右键单击/Maven/启用 Maven 依赖项(然后重新启动并重新发布到 Tomcat)。

    似乎 STS 或 m2Eclipse 未能将所有 spring webflow jar 推送到 web 应用程序 lib 目录中。我不确定为什么。但是启用 Maven 依赖处理然后重建似乎可以解决问题; webflow jar 最终被发布,因此它可以找到模式命名空间引用。

    我通过浏览 web 应用程序发布到的 tomcat 目录对此进行了调查,在它运行时单击 WEB-INF/lib/ 并注意到它缺少 webflow jar 文件。

    【讨论】:

      【解决方案6】:

      这个技巧也对我有用:在 Eclipse 中右键单击项目,然后 Maven > Update Dependencies。

      【讨论】:

        【解决方案7】:

        如果其他人遇到这个问题,我只是使用 Eclipse;通过右键单击操作运行项目。此错误发生在 J2EE 视图中,但未发生在 Java 视图中。不确定-假设将库添加到正确的“lib”目录中。

        我也在使用一个 Maven 项目,允许 m2eclipse 管理依赖关系。

        【讨论】:

          【解决方案8】:

          我对 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。

          问候。 帕科夫

          【讨论】:

          • +1 用于提及 PluggableSchemaResolver。这是一篇关于这个主题的好文章:denis-zhdanov.blogspot.com/2010/01/…
          • 是的,谢谢,合并所有弹簧罐中的所有 META-INF/spring.schemas(META-INF/spring.handlers 相同)是我的解决方案。
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

            确保您已解决所有依赖项

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

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

            但是那个不见了。在原始问题中,还有一个问题可能导致该症状。

            我正在使用 Eclipse(霓虹灯)、Java SE 8、bean 3.0、spring AOP 3.0、Spring 4.3.4。问题显示在 Java 视图中——不是 JEE——,并且在尝试使用右键菜单 -> 运行方式 -> Java 应用程序运行应用程序时。

            【讨论】:

              【解决方案11】:

              您也可以尝试使用为我们解决问题的 one-jar maven 插件。只需按照here 的说明进行操作即可。

              【讨论】:

                猜你喜欢
                • 2014-12-30
                • 2015-06-09
                • 2011-01-10
                • 2013-10-25
                • 2016-08-10
                相关资源
                最近更新 更多