【问题标题】:Calling previous version of Spring with exception java.lang.NoSuchMethodError: BeanDefinitionParserDelegate.getEnvironment()使用异常 java.lang.NoSuchMethodError: BeanDefinitionParserDelegate.getEnvironment() 调用 Spring 的早期版本
【发布时间】:2018-01-14 14:53:29
【问题描述】:

pom.xml 为:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jvoid</groupId>
    <artifactId>jvoidproducts</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>jVoidProducts</name>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <!--<org.springframework-version>4.1.4.RELEASE</org.springframework-version>
        <hibernate.version>4.2.16.Final</hibernate.version>-->
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.jvoid</groupId>
            <artifactId>persistenceapi</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>com.jvoid</groupId>
            <artifactId>hibernate</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version><!--JavaEE7 onwards-->
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.0.0.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-asm</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>

            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.10</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20090211</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-extras</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path-assert</artifactId>
            <version>0.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- Apache Commons DBCP -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- Spring ORM -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.1.10.Final</version>

        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.10.Final</version>
        </dependency>

    </dependencies>
    <build><finalName>${project.artifactId}</finalName></build>
</project>

在使用上述 pom 运行项目时,我得到以下异常: 服务器使用Tomcat v6。

堆栈跟踪:

javax.servlet.ServletException: Servlet.init() for servlet DispatcherServlet threw exception
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)
root cause

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/spring/webcontext/DispatcherServlet-context.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.getEnvironment()Lorg/springframework/core/env/Environment;
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:413)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:223)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:194)
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:676)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:642)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:690)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:558)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:499)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:172)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)
root cause

java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.getEnvironment()Lorg/springframework/core/env/Environment;
    org.springframework.context.annotation.ComponentScanBeanDefinitionParser.configureScanner(ComponentScanBeanDefinitionParser.java:102)
    org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
    org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
    org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1366)
    org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1352)
    org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:178)
    org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:148)
    org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:98)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:223)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:194)
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:676)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:642)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:690)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:558)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:499)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:172)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)

上面的堆栈跟踪显示org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.getEnvironment() 方法不存在。显示在第102行org.springframework.context.annotation.ComponentScanBeanDefinitionParser类的方法configureScanner()中调用了org.springframework.beans.factory.xml.BeanDefinitionParserDelegate类的方法getEnvironment()

当我检查上述类的源代码时,我发现:

在类ComponentScanBeanDefinitionParser(发布5.0.1.Release)的第102行(在方法configureScanner()中)没有调用类BeanDefinitionParserDelegategetEnvironment()方法。

但是当我检查时,我发现在Release 4.3.5.Release(或者它可能是4.3.13)中,它存在于行102 但在那之后的版本中没有。

根据上面给出的 pom,我使用的是 spring 版本 5.0.1.Release 那么为什么它调用以前版本(4.3.5.Release)的 getEnvironment() 方法?

上述错误堆栈的调用跟踪方法给出为(正如我所检查的那样)(可能有助于以任何方式回答):

org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory() 在 org.springframework.context.support.AbstractApplicationContext.refresh() 中调用 在 4.1.9 之前的版本中的第 454 行,但之后没有---------> AbstractRefreshableApplicationContext.refreshBeanFactory() 在 540 时调用 v4.1.9----->XmlWebApplicationContext.loadBeanDefinitions() 被调用 在第 129 行至 v5.0.0.RC2-------->XmlWebApplicationContext.loadBeanDefinitions() 是 在第 94 行调用 v5.0.1.Release------>AbstractBeanDefinitionReader.loadBeanDefinitions()在类XmlWebApplicationContext的125处调用 v5.0.1.Release---->AbstractBeanDefinitionReader.loadBeanDefinitions() 在 AbstractBeanDefinitionReader 的 194 处调用 v5.0.1.Release---->AbstractBeanDefinitionReader.loadBeanDefinitions() 在 AbstractBeanDefinitionReader 的 223 处调用 v5.0.1.Release------------->XmlBeanDefinitionReader.loadBeanDefinitions() 在 AbstractBeanDefinitionReader 类的第 187 行调用 v5.0.1.Release----->XmlBeanDefinitionReader.loadBeanDefinitions() 是 在类 XmlBeanDefinitionReader 的第 303 行调用 v5.0.1.Release------------>XmlBeanDefinitionReader.doLoadBeanDefinitions() 在类 XmlBeanDefinitionReader 的第 335 行调用 V5.0.1.Release----------->XmlBeanDefinitionReader.registerBeanDefinitions() 在类 XmlBeanDefinitionReader 的第 391 行调用 v5.0.1.Release------------->DefaultBeanDefinitionDocumentReader.registerBeanDefinitions() 在类 XmlBeanDefinitionReader 的第 507 行调用 v5.0.1.Release----------->DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions() 在类 DefaultBeanDefinitionDocumentReader 的第 98 行调用 v5.0.1.Release---------->DefaultBeanDefinitionDocumentReader.arseBeanDefinitions() 在类 DefaultBeanDefinitionDocumentReader 的第 148 行调用 v5.0.1.Release--------->BeanDefinitionParserDelegate.parseCustomElement() 在类 DefaultBeanDefinitionDocumentReader 的第 178 行调用 v5.0.1.Release---------->BeanDefinitionParserDelegate.parseCustomElement() 在类 BeanDefinitionParserDelegate 的第 1352 行调用 v5.0.1.Release-------->NamespaceHandlerSupport.parse() 被调用在 类 BeanDefinitionParserDelegate 的第 1366 行 v5.0.1.Release-------->ComponentScanBeanDefinitionParser.parse() 是 在类 NamespaceHandlerSupport 的第 74 行调用 v5.0.1.Release------------>ComponentScanBeanDefinitionParser.configureScanner() 在 ComponentScanBeanDefinitionParser 类的第 84 行调用 v4.1.0.Release--------->BeanDefinitionParserDelegate.getEnvironment() 在 ComponentScanBeanDefinitionParser 类的第 102 行调用

v4.1.0.发布

【问题讨论】:

  • 执行mvn dependency:tree 并检查您的依赖关系。由于 Spring WebFlow 依赖关系,您可能正在引入旧的依赖关系。
  • @M.Deinum:谢谢!我通过您提到的dependency:tree 命令解决了它。这不是由于 spring webflow 依赖,而是由于其他一些原因。如果您将此评论作为答案,我会将其标记为答案。

标签: spring hibernate maven spring-mvc


【解决方案1】:

使用mvn dependency:tree,您可以检查正在拉入哪些依赖项以及正在拉入哪些传递依赖项。您可以使用它来获得关于调整什么的线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多