在学习spring过程中遇见了种种不同的异常错误,这里做了一下总结。希望遇见类似错误的同学们共勉一下。
1. 错误一
Error creating bean with name 'helloServiceImpl' defined in class path resource [spring-service.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'helloDao' of bean class [www.csdn.spring.service.impl.HelloServiceImpl]:
Bean property 'helloDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'helloDao' of bean class
这类错误是:一般都是创建了一个dao的spring文件比方spring-dao有创建了一个service的spring文件,在spring-service.xml中引用dao的中定义的id名,导致的错误,疏忽是:写service实现类的时候忘记了写相应dao的setter方法,即所谓的依赖注入
比方:
private HelloDao helloDao;
//set依赖注入非常重要,不写会报错,不能读写helloDao这一属性
publicvoid setHelloDao(HelloDao helloDao) {
System.out
.println("控制反转:应用程序本身不在负责创建helloDao对象,而是由spring容器负责创建、管理、维护。这样控制权转移,称为反转。
"
+ "能够通过依赖注入方式注入该HelloDao对象");
this.helloDao = helloDao;
}
2. 错误二
Configuration problem: Failed to import bean definitions from relative location [spring-dao.xml]Offending resource: class path resource [spring.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 9 in XML document
from class path resource [spring-dao.xml] is invalid; nested exception is org.xml.sax.SAXParseException: Open quote is expected for attribute "{1}" associated with an element type "scope".
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 9 in XML document from class path resource [spring-dao.xml] is invalid; nested exception is org.xml.sax.SAXParseException: Open quote is expected for
Caused by: org.xml.sax.SAXParseException: Open quote is expected for attribute "{1}" associated with an element type "scope".
这种错误是马虎的错误,在相应的spring的配置文件里。bean标签的scope属性忘了加引號。在配置文件里国不会报错,可是在执行的时候就会出这种错,一般导致错误的原因是复制的时候疏忽了引號。直接将原来的引號覆盖了。导致了最后该属性没有引號。
<bean id="helloDaoImpl" class="www.csdn.spring.dao.impl.HelloDaoImpl"
scope="prototype"></bean>
错误的写成:
bean id="helloDaoImpl" class="www.csdn.spring.dao.impl.HelloDaoImpl"
scope=prototype></bean>
3. 错误三
No bean named 'helloServiceImp' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition
这样的报错可是没有Caused by语句的错误一般都是使用的时候单词写错了,这里写错的地方是在java类中,类中引用id的时候写错了单词;比方这里的错,注意以下的红色文字:
HelloService helloService2 = (HelloService) context.getBean("helloServiceImp",HelloServiceImpl.class);
<bean id="helloServiceImpl" class="www.csdn.spring.service.impl.HelloServiceImpl" scope="singleton" lazy-init="false">
<property name="helloDao" ref="helloDaoImpl"/>
</bean>
眼尖的哥们预计都看出来了这两个单词写的不一样。获取bean的方法中引用的id少写了一个“i”,导致spring容器在读取的时候不能识别。以后注意细心就好。
4. 错误四
Error creating bean with name 'helloServiceImpl' defined in class path resource [spring-service.xml]: Cannot resolve reference to bean 'helloDaoImp' while setting bean property 'helloDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'helloDaoImp' is defined
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'helloDaoImp' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition
这样的也是单词写错的情况。与上面不同的是这样的情况给出了Caused by语句,让你更清楚发生错误的原因,英文还差点儿相同的哥们或者有一定编程经验的人员一看Caused by语句就应该能推断出什么错误;这里错误原因明显才、指出每个名字为'helloDaoImp'的bean,或名字为'helloDaoImp'的bean没有定义。这样的错也好好找,一般都是互相引用的spring配置文件马虎出的错。以下一个样例说明:比方spring-service.xml引用spring-dao的时候,还是如上面说的一样,重点再红色字体
Service配置文件里这么写:
<bean id="helloServiceImpl" class="www.csdn.spring.service.impl.HelloServiceImpl" scope="singleton" lazy-init="false">
<property name="helloDao" ref="helloDaoImp"/>
</bean>
可是dao配置文件里却这么写:
bean id="helloDaoImpl" class="www.csdn.spring.dao.impl.HelloDaoImpl"
scope="prototype"></bean>
写到这大家就清楚了吧,与上一个错误基本上一样,都是单词写错的错误,仅仅只是不同的是上一个错误是在java类中引用id的时候写错单词出的错。而这一个错误是在spring配置文件里国引用id出的错,万变不离其宗,错误的额原因都是单词写错,今后细心就可以。
5. 错误五
Cannot find class [www.csdn.spring.dao.imp.HelloDaoImpl] for bean with name 'helloDaoImpl' defined in ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.lang.ClassNotFoundException:www.csdn.spring.dao.imp.HelloDaoImpl
Caused by: java.lang.ClassNotFoundException: www.csdn.spring.dao.HelloDaoImpl
错误原因:倒错包了,我的web项目HelloDaoImpl在dao.impl包下而不是dao包下。
所以包这种错,看一下spring配置文具店额classes标签的值导入的类包名是否正确
6. 错误六
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'employeeBean' defined in class path resource [spring-constructor.xml]: Unsatisfied dependency expressed through constructor argument with index 2 of type [double]:
Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?
错误原因:bean实例类中的属性类型与spring配置文件里的构造器属性类型不正确应所导致,这样的情况多出在使用类型指定构造器參数;比方:
类中属性例如以下,重点注意红色部分:
private String name;
private String sex;
private doublesalary;
spring配置文件里的构造器标签
<constructor-arg type="java.lang.String" value="杨凯" />
<constructor-arg type="java.lang.String" value="男" />
<constructor-arg type=" java.lang.Double" value="5000.00" />
这样的错误是由于构造器中的type属性不会自己主动相应拆箱装箱属性类型。简单点说就是类中使用的是基本数据类型。配置文件里相应的type属性值就要是基本数据类型。类中使用的是类类型,配置文件里相应的type属性值就要是包名加上类类型。
另一种原因就是不正确应的原因。constructor-arg直接写错了,比方:private doublesalary;相应了<constructor-arg type=" Double" value="5000.00" />
或者顺序不正确的情况下回出现赋值错误,比方同一时候存在两个同样类型的属性,name应该为“杨凯”,假设sex在配置文件的位置与name的颠倒了,会出现name=“男”的情况
<constructor-arg name="timeOut" value="${plus.PlusInvitationListRemoteService.timeout}" />
spring在找不到value值的时候也会报构造參数类型错误
7. 错误七
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberBean' defined in class path resource [spring-construtor.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException:
Failed to convert property value of type 'java.lang.String' to required type 'www.csdn.spring.constructor.Member' for property 'member'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [www.csdn.spring.constructor.Member]
for property 'member': no matching editors or conversion strategy found
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'www.csdn.spring.constructor.Member' for property 'member'; nested exception is java.lang.IllegalStateException:
Cannot convert value of type [java.lang.String] to required type [www.csdn.spring.constructor.Member] for property 'member': no matching editors or conversion strategy found
错误原因:这样的情况是一个bean实例引用还有一个bean实例对象。而引用的那个bean实例对象为空。可是在改bean实例的配置文件里又错误指明空值。举个样例说明:
<bean id="memberBean" class="www.csdn.spring.constructor.MemberBean">
<!-- value="null" 这里给value赋的是一个空字符串。而不是一个null空值 -->
<property name="name" value="null"/>
<property name="member">
<null/>
</property>
</bean>
关键看红色部分,红色部分是正确的写法,这样写引用空值对象才不会报错,可是假设你像上面引用nam属性那样指明value=“null”就会出现改错。
8. 错误八
错误一:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'deptBean' is already used in this <beans> element
Offending resource: class path resource [spring-byType.xml]
错误二:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'empBean' defined in class path resource [spring-byType.xml]: Unsatisfied dependency expressed through bean property 'deptBean': : No qualifying bean of type [www.csdn.spring.autowire.DeptBean]
is defined: expected single matching bean but found 2: deptBean,deptBean1; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.DeptBean] is defined: expected single matching
bean but found 2: deptBean,deptBean1
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.DeptBean] is defined: expected single matching bean but found 2: deptBean,deptBean1
这两种错误原因:都是spring配置文件里自己主动装配按byType时出的问题,配置文件, 红色部分为错误的解释和导致错误的原因例如以下:
<bean id="compBean" class="www.csdn.spring.autowire.CompBean">
<property name="name" value="DELL"/>
</bean>
<bean id="deptBean" class="www.csdn.spring.autowire.DeptBean">
<property name="name" value="销售部门"/>
</bean>
<!--
这里仅仅能出现一个deotBean,id名不一样可是类型一样。都是deptBean实体的;id="deptBean"或同类型的不同id都会抛异常
<bean id="deptBean1" class="www.csdn.spring.autowire.DeptBean">
<property name="name" value="销售部门"/>
</bean> -->
<!-- 使用autoWrie自己主动装配,改属性值byType;
按类型自己主动装配,前提是同一个类型的仅仅能有一个-->
<bean id="empBean" class="www.csdn.spring.autowire.EmpBean" autowire="byType">
<property name="name" value="杨凯"/>
<!-- <property name="comp" ref="compBean"/>
<property name="dept" ref="deptBean"/> -->
</bean>
9. 错误九
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'empBean' defined in class path resource [spring-byConstructor.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [www.csdn.spring.autowire.DeptBean]:
: No qualifying bean of type [www.csdn.spring.autowire.DeptBean] is defined: expected single matching bean but found 2: deptBean1,deptBean2; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.DeptBean]
is defined: expected single matching bean but found 2: deptBean1,deptBean2
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.DeptBean] is defined: expected single matching bean but found 2: deptBean1,deptBean2
错误原因: spring配置文件里自己主动装配按constructor时出的问题,配置文件, 红色部分为错误的解释和导致错误的原因例如以下:
<!-- 在spring3.2以上版本号中:使用构造器自己主动装配时,假设有一个id与bean实例中的属性名同样的配置bean存在,尽管构造器自己主动装配是按类型自己主动装配的,
可是即使有多个同样类型的bean存在也不受影响。受影响的情况是:没有与bean实例中的属性名同样的配置bean存在。
又有多个同样类型的bean配置,就会抛异常-->
<bean id="deptBean" class="www.csdn.spring.autowire.DeptBean">
<property name="name" value="销售部门"/>
</bean>
<bean id="deptBean1" class="www.csdn.spring.autowire.DeptBean">
<property name="name" value="销售部门"/>
</bean>
<bean id="deptBean2" class="www.csdn.spring.autowire.DeptBean">
<property name="name" value="销售部门"/>
</bean>
<!-- 使用autoWrie自己主动装配。改属性值constructor;构造器自己主动装配就是按类型自己主动装配
beam实例中必须结合构造器使用。假设没有构造器自己主动装配后注入不进去值,取出为空值-->
<bean id="empBean" class="www.csdn.spring.autowire.EmpBean" autowire="constructor">
<property name="name" value="杨凯"/>
<!-- <property name="comp" ref="compBean"/>
<property name="dept" ref="deptBean"/> -->
</bean>
10. 错误十
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unexpected failure
during bean definition parsing
Offending resource: class path resource [spring-collection.xml]
Bean 'collectionBean'; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: <property> element for property 'users' must specify a ref or value
Offending resource: class path resource [spring-collection.xml]
Bean 'collectionBean'
-> Property 'users'
Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: <property>
element for property 'users' must specify a ref or value
Offending resource: class path resource [spring-collection.xml]
Bean 'collectionBean'
-> Property 'users'
乍一看。有些许没有头脑,可是放下心细致看看,提示说什么users属性怎么怎么滴;另一点提示就是说是spring-collection.xml配置文件里的错误。这就好找。找到改配置中有关users的地方。
<bean id="u1" class="www.csdn.spring.collection.set.User">
<property name="name" value="杨凯" />
<property name="age" value="22" />
</bean>
。。。。
。
这种代码肯定不会出错了。假设是这里的错报的就不是这个错了。可能就是第一条或第二条错了;再找下一块有users的地方。找到了这里:
<!-- list集合 -->
<property name="users">
<!-- <array>
<ref bean="u1" />
<ref bean="u2" />
<ref bean="u3" />
</array> -->
<!-- <list>
<ref bean="u1"/>
<ref bean="u2"/>
<ref bean="u3"/>
</list> -->
<!-- 还能够通过spring自带的sehema约束中的util工具约束的list集合遍历-->
<util:list>
<ref bean="u1" />
<ref bean="u2" />
<ref bean="u3" />
</util:list>
</property>
细致一看真是这里的错,红色部分最開始忘了写,凝视掉了上面的list注入值的方式,后面的uti标签注入值有没有写。这是在測试类中取值遍历的时候就会遍历一个空的users。这是由于是没有注入值的错,所以没有报空指针的错。报的是这样的莫名其妙的错。
11. 错误十一
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'proxyFactoryBean' must be of type [www.csdn.spring.advice.SayServiceImpls], but was actually of type [$Proxy4]
这种错误一般出在aop面向切面的编程中,spring面向切面的代理有两种,一种是jdk动态代理,一种是cglib代理;这是你在使用的的使用假设混合时候就会出现上面的错;这两种代理的差别是前者是接口代理,就是返回一个接口类型对象,而后者是类代理,不能返回接口类型对象仅仅能返回类类型对象,假设返回接口了相同会出这种错。
还有可能出错的地方就是相应的spring配置文件。这
里是最easy马虎出错的地方。细致检查一下的你的目标对象。比方:<!-- 目标对象 -->
<property name="target">
<ref bean="sayServiceImpls"/>
</property>
这里在引用bean的时候可能引入错误,可能会引入jdk动态代理的目标类,也有可能你的目标类中实现了某些接口,不符合cglib代理的理念。还有可能马虎出错的地方:
<!-- 真实主题 目标对象 -->
<bean id="sayServiceImpls" class="www.csdn.spring.advice.SayServiceImpls"></bean>
真实对象的id和class属性设置错误的时候也会出错。
12. 错误十二
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'proxyFactoryBean' defined in class path resource [spring-advice.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException;
nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'proxyInterfaces' threw exception; nested exception is java.lang.IllegalArgumentException: [www.csdn.spring.proxy.advice.SayServiceImpl] is not an interface
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'proxyInterfaces' threw exception; nested exception is java.lang.IllegalArgumentException:
[www.csdn.spring.proxy.advice.SayServiceImpl] is not an interface
这个问题非常好解决,最关键的问题出在红色部分。原因是在spring相关配置文件里设置抽象主题的时候。既然是抽象主题就应该设置成接口。而不应该是实现类。比方以下的代码。注意红色部分:
<!--抽象主题 实现接口 -->
<property name="proxyInterfaces">
<array>
<value>www.csdn.spring.proxy.advice.SayServiceImpl</value>
</array>
</property>
正确的写法应该是:
<!--抽象主题 实现接口 -->
<property name="proxyInterfaces">
<array>
<value>www.csdn.spring.proxy.advice.SayService</value>
</array>
</property>
13. 错误十三
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'proxyFactoryBean': FactoryBean threw exception on object creation; nested exception is org.springframework.aop.framework.AopConfigException: Unknown advisor type class www.csdn.spring.proxy.advice.AuditableImpl;
Can only include Advisor or Advice type beans in interceptorNames chain except for last entry,which may also be target or TargetSource; nested exception is org.springframework.aop.framework.adapter.UnknownAdviceTypeException: Advice object [www.csdn.spring.proxy.advice.AuditableImpl@1f758500]
is neither a supported subinterface of [org.aopalliance.aop.Advice] nor an [org.springframework.aop.Advisor]
Caused by: org.springframework.aop.framework.AopConfigException: Unknown advisor type class www.csdn.spring.proxy.advice.AuditableImpl; Can only include Advisor or Advice type beans in interceptorNames chain except for last entry,which may also be target
or TargetSource; nested exception is org.springframework.aop.framework.adapter.UnknownAdviceTypeException: Advice object [www.csdn.spring.proxy.advice.AuditableImpl@1f758500] is neither a supported subinterface of [org.aopalliance.aop.Advice] nor an [org.springframework.aop.Advisor]
这个错误即红色部分提示的错误。不知道advice类型的异常,说白了就是编写的spring通知的错误,这样的错误比較常见。也是出于马虎的错误。比方前者通知、后置通知、围绕通知、异常通知、引入通知等这几个通知中的不论什么一个通知类忘了写继承的父类。下面列出这几个通知的类编写所继承的类:
前置通知:
public class BeforeAdvice implements MethodBeforeAdvice
后置通知:
public class AfterAdvice implements AfterReturningAdvice
围绕通知:
public class AroundAdvice implements MethodInterceptor
异常通知:
public class ThrowAdvice implements ThrowsAdvice
引入通知:
public class AuditableImpl extends DelegatingIntroductionInterceptor implements Auditable
14. 错误十四
java.lang.ClassCastException:
$Proxy10 cannot be cast to www.csdn.spring.proxy.advice.Auditable
java.lang.ClassCastException:
$Proxy11 cannot be cast to www.csdn.spring.proxy.advice.Auditable
像以上这个出现$ProxyXX cannot be cast to www.csdn.spring.proxy.advice.Auditable;什么代理不能强转成某一个类型的错误。一般都是在使用JDK动态代理或cglib代理的时候出现的错误,错误原因有:
1).JDK动态代理与cglib代理混淆。比方使用cglib代理时不能实现接口,你可能在使用的时候使用了cglib代理,可是却实现了接口,假设你在spring配置文件里使用aspectjs来进行通知,又想使用cglib接口那么你须要做的是目标类不实现接口,spring配置文件里配置aop的时候加上以下红色部分。
<aop:aspectj-autoproxyproxy-target-class="true"/>
2)相同是使用aspectjs通知的时候,尤其是使用引入通知的时候。一定不要忘了让引用通知的业务类加上注解@Aspect。还要注意的是你使用的引入目标类和事实上现接口的类路径一定要正确,我这里就范了一个小错误。到错包的错:
package www.csdn.spring.proxy.advice.aspectjs;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
@Aspect
publicclass AuditableService {
@DeclareParents(value="*..*Service*", defaultImpl = AuditableImpl.class)
public Auditable auditable;
}
我在使用Auditable接口的时候倒错了包。这里事实上类都在同一包下。根本不用倒包。可是我从上一个包中复制代码的时候自己主动给我引入了上一个包的Auditable类。以后一定要注意了
15. 错误十五
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: <aspect> tag needs aspect bean reference via 'ref' attribute when declaring advices.
Offending resource: file [F:\csdn-study\MyWorkspace\springHelloJava\bin\spring-pojoXmlAspectjs.xml]
Aspect: ref=''
这个错误顾名思义。这里已经提示的非常清了。这里列出这个错误是对那些对pojo-xml配置通知不太熟悉的同学而言;这个错误就是在相应的spring配置文件里使用aop切面的时候忘写了一个ref熟悉的错,详细案例代码例如以下,注意以下的红色部分,错误就出在红色部分忘了写ref="adviceService":
<!-- 使用pojo-xml aspectjs配置自己主动代理 -->
<aop:config>
<!-- 配置切面 -->
<aop:aspect ref="adviceService">
<!-- 引入通知 -->
<aop:declare-parents types-matching="*..*Service*"
<p style="border-width: 0px; padding-top: 0px; pad