Bean property ‘bookTypeMapper’ is not writable or has an invalid setter method. Did you mean ‘booktypeMapper’?
第一行报错是这样的
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘bookTypeService’ defined in class path resource [applicationContent.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property ‘bookTypeMapper’ of bean class [service.impl.BookTypeServiceImpl]: Bean property ‘bookTypeMapper’ is not writable or has an invalid setter method. Did you mean ‘booktypeMapper’?
完整报错是这样的
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1570)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1280)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:551)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:756)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at ssmTest.test1.test2(test1.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'bookTypeMapper' of bean class [service.impl.BookTypeServiceImpl]: Bean property 'bookTypeMapper' is not writable or has an invalid setter method. Did you mean 'booktypeMapper'?
at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:239)
at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:435)
at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:290)
at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1566)
... 36 more
项目是通过数据库反向生成的,
先看报错的关键信息
—原文:
Bean property ‘bookTypeMapper’ is not writable or has an invalid setter method. Did you mean ‘booktypeMapper’?
—百度翻译:
bean属性“bookTypeMapper”不可写或具有无效的setter方法。你是说“booktypeMapper”吗?
第一反应应该是大小写问题,但是看了下项目
然后applicationContent.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder
location="classpath:db.properties"></context:property-placeholder>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!--驱动类名 -->
<property name="driverClass" value="${jdbc_driverClassName}" />
<!-- url -->
<property name="jdbcUrl" value="${jdbc_url}" />
<!-- 用户名 -->
<property name="user" value="${jdbc_username}" />
<!-- 密码 -->
<property name="password" value="${jdbc_password}" />
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
<property name="acquireIncrement" value="5"></property>
<!-- 初始连接池大小 -->
<property name="initialPoolSize" value="10"></property>
<!-- 连接池中连接最小个数 -->
<property name="minPoolSize" value="5"></property>
<!-- 连接池中连接最大个数 -->
<property name="maxPoolSize" value="20"></property>
</bean>
<!-- 会话工厂bean sqlSessionFactoryBean -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:mybatis-config.xml" />
</bean>
<!-- 自动扫描对象关系映射 --> <!-- 扫描数据访问层下的接口,并实例化 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"></property>
<!-- 指定要自动扫描接口的基础包,实现接口 -->
<property name="basePackage" value="mapper" />
</bean>
<!-- 声明式事务管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven
transaction-manager="transactionManager" />
<tx:advice id="txtAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="search*" propagation="NEVER" />
<tx:method name="find*" propagation="NEVER" />
<tx:method name="select*" propagation="NEVER" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* service..*(..))"
id="pointCut" />
<!-- 把Advice织入Pointcut位置 -->
<aop:advisor advice-ref="txtAdvice"
pointcut-ref="pointCut" />
</aop:config>
<bean id="bookTypeService"
class="service.impl.BookTypeServiceImpl">
<property name="bookTypeMapper" ref="bookTypeMapper" />
</bean>
</beans>
主要看最后相关的bookTypeService那个bean 报错就是这里
然后看BookTypeServiceImpl 类
package service.impl;
import java.util.List;
import mapper.BookTypeMapper;
import model.BookType;
import service.BookTypeService;
public class BookTypeServiceImpl implements BookTypeService {
private BookTypeMapper bookTypeMapper;
public void setBooktypeMapper(BookTypeMapper bookTypeMapper) {
this.bookTypeMapper = bookTypeMapper;
}
public List<BookType> selectAll() {
// TODO Auto-generated method stub
List<BookType> list = bookTypeMapper.selectAll();
return list;
}
}
乍一看完全没有问题,类的属性也没问题,但是仔细一看,在BookTypeServiceImpl中的 bookTypeMapper 的setter方法中的大小写
public void setBooktypeMapper(BookTypeMapper bookTypeMapper) {
this.bookTypeMapper = bookTypeMapper;
}
public void setBookTypeMapper(BookTypeMapper bookTypeMapper) {
this.bookTypeMapper = bookTypeMapper;
}
两个setter方法的区别在意 一个bookType 一个booktype
区别就是一个字母 “T” 的大小写
我改掉之后就没问题了
setter方法当时也是使用eclipse自动生成的。给自己挖了一个坑
太难受了
开始使用注解之后使用@autowired可以不写setter方法,spring框架会自己生成