当运行一个非常基本的Spring应用程序并使用 FileSystemXmlApplicationContext 创建Bean Factory时,遇到 NoSuchMethodError 。
beans.xml 文件位于带有pom.xml的应用程序的根目录下,如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"
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-3.1.xsd">
<bean id="person" class="com.xyz.practice.Person">
</bean>
</beans>
Person类看起来像:
package com.xyz.practice;
public class Person {
public void speak(){
System.out.println("Hello I'm a Person");
}
}
主类App.java如下所示:
package com.xyz.practice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");
Person person = (Person) context.getBean("person");
person.speak();
}
}
运行应用程序时,会抛出以下异常:
INFO: Loading XML bean definitions from file [/home/salmank/Documents/springWithAbc/beans.xml]
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.clearMetadataCache()V
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:185)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
at com.xyz.practice.App.main(App.java:9)
答案 0 :(得分:2)
您的类路径中包含不兼容的jar文件。检查spring-context-support
和spring-beans
的版本
缺少的方法是在4.2版本中引入的:
void clearMetadataCache()
清除合并的bean定义缓存,删除bean的条目 哪些不符合完整元数据缓存的条件。 通常在更改原始bean定义后触发, 例如在应用BeanFactoryPostProcessor之后。请注意元数据 此时已经创建的bean将被保留 周围。
自:4.2
另见:getBeanDefinition(java.lang.String), ConfigurableBeanFactory.getMergedBeanDefinition(java.lang.String中)
检查spring-context-support
的版本是否与spring-beans
顺便说一句:删除xsd位置末尾的版本:
http://www.springframework.org/schema/beans/spring-beans.xsd">
答案 1 :(得分:2)
您正在pom.xml中混合使用不同的版本(spring-core.jar和spring-beans.jar)。请更正如下。
在:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
后:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
答案 2 :(得分:1)
这是由于春天的自由版本之间的版本不匹配。
void clearMetadataCache()
方法已添加到ConfigurableListableBeanFactory since 4.2.0 version release
中。因此,如果您使用的是spring-beans
库版本less than 4.2.0 versions
,则可能会遇到Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.clearMetadataCache()V
这种异常。
因此,尝试在lib中添加适当的版本jar。
Added Methods ::
spring-beans-4.2.0.RELEASE.jar,
ConfigurableListableBeanFactory.class
package org.springframework.beans.factory.config
ConfigurableListableBeanFactory.clearMetadataCache ( ) [abstract] : void
有关详细信息,您也可以参考此网址:https://abi-laboratory.pro/java/tracker/compat_report/spring-framework/4.1.9/4.2.0/e1bb7/src_compat_report.html#Added