最近在做项目,在Eclipse上编写java的过程中,经常碰到各种各样的错误,所以在这里将自己碰到的部分问题汇总,下面仅写出了自己的解决方法。不代表能够解决所有人的问题!供有需要的同仁参考,如有见解或更多解决方法,请留言指出。感谢!
BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
原因:spring初始化bean对象出错;
1)xml的bean的id 有重复;
2)如果是注解配置:可能是注解的名称有重复;
解决方法:只需要将重复的bean 的id和重复的注解改了就行了。
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [F:\workSpaces\javaEE2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\cxfSsh\WEB-INF\classes\cn\yangjieyu\controller\HelloController.class]; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
意思是:有个叫ClassMetadataReadingVisitor的类,以一个叫ClassVisitor的接口作为父类了
但是Java中类和接口的关系只能是实现,而不是继承。那么接下来我们在尝试在Eclipse中打开这个报错的类。
原因:首先查询org.springframework.core.type.classreading.ClassMetadataReadingVisitor【使用Ctrl+Shift+T 查询类】
打开ClassMetadataReadingVisitor类(maven仓库中会下载源码,故打开第四个),可以看到类的声明如下:
class ClassMetadataReadingVisitor extends ClassVisitor implements ClassMetadata
然后查询org.springframework.asm.ClassVisitor
在workspace中可以发现有5个这样的类,并且包名都一样。可以看到在spring-asm的3.0.7版本中这个ClassVistor其实是一个接口,这个接口被放在org.spring.asm包中。
下面检查一下我的maven依赖包:
明显看出,上面两者发生了冲突。必须删掉其中一个包,但是这里是maven项目,并且只有spring-core这个依赖,那么另一个asm.jar包就是因为加载其他依赖包时导入的。所以这里要通过maven解除此依赖关系。
在过滤栏中输入asm,右侧出现了asm相关包的依赖结构,左侧则是pom.xml全部依赖包的列表展示。
解决方法:右击spring-asm:3.0.7 ->Exclude Maven Artifact
修改后对应的dependency部分文件如下:
<dependency>
<groupId>org.apache.cxfgroupId>
<artifactId>cxf-bundleartifactId>
<version>${webserviceVersion}version>
<exclusions>
<exclusion>
<groupId>org.springframeworkgroupId>
<artifactId>spring-asmartifactId>
exclusion>
exclusions>
dependency>
这样就通过maven解决了jar包依赖而报错的问题。
反思:在这个maven项目中,并没有发现自己添加过spring-asm的依赖,但是确实导入了这个jar包,所以不清楚包之间的依赖关系时,必须根据错误找到问题根源解决。另外,在maven处理依赖包时,不要随便加入依赖包,避免发生冲突。
java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.
原因:(1)缺少spring-expression jar包
解决方法:导入依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>${springVersion}version>
dependency>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cxf' defined in class path resource [META-INF/cxf/cxf.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
关键:Error creating bean with name 'cxf' defined in class path resource [META-INF/cxf/cxf.xml]: BeanPostProcessor before instantiation of bean failed;
原因:注入bean失败异常
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/classes/application-context.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
原因:缺少spring-aop-X.X.X.RELEASE.jar的包
解决方法:添加maven依赖;
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>${springVersion}version>
dependency>
[org.springframework.web.context.support.XmlWebApplicationContext]Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cxf' defined in class path resource [META-INF/cxf/cxf.xml]:
原因:如果使用cxf的版本是3.x以上的,那么在applicationContext.xml文件中只需要引入下面三个xml文件的第一个
<import resource="classpath:META-INF/cxf/cxf.xml" />
解决方法:只引入上面的第一个xml文件
java.lang.NoClassDefFoundError:[Lorg/springframework/context/ApplicationContextInitializer;
解决方法:添加spring-context.x.x.x RELEASE jar包
警告: Interceptor for {http://service.spring.demo/}HelloWorldImplService has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No binding operation info while invoking unknown method with params unknown.
利用cxf发布webservice时,访问地址http://localhost:8080/cxfSpring/webservice/HelloWorld时,报错如上。
解决方法:将访问地址改为http://localhost:8080/cxfSpring/webservice/HelloWorld?wsdl即可访问到wsdl页面