设置属性值时出错; 嵌套exception是org.springframework.beans.NotWritablePropertyException:

我试图使用Spring实用程序ResultSetExtractor从MySQL数据库获取数据,但我得到以下exception:

 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'edao' defined in class path resource [applicationContext2.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'jdbcTemplate' of bean class [org.resultset.EmployeeDao]: Bean property 'jdbcTemplate' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1344) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:871) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83) at org.resultset.Test.main(Test.java:11) Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'jdbcTemplate' of bean class [org.resultset.EmployeeDao]: Bean property 'jdbcTemplate' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1012) at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:857) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1341) ... 13 more 

Employee.java

 public class Employee { private int id; private String name; private float salary; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } public Employee(int id, String name, float salary) { super(); this.id = id; this.name = name; this.salary = salary; } public Employee() { } } 

EmployeeDao.java

 public class EmployeeDao { private JdbcTemplate template; public void setTemplate(JdbcTemplate template) { this.template = template; } public List getAllEmployees(){ return template.query("select * from employee",new ResultSetExtractor<List>(){ @Override public List extractData(ResultSet rs) throws SQLException, DataAccessException { List list=new ArrayList(); while(rs.next()){ Employee e=new Employee(); e.setId(rs.getInt(1)); e.setName(rs.getString(2)); e.setSalary(rs.getInt(3)); list.add(e); } return list; } }); } } 

Test.java

 public class Test { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml"); EmployeeDao dao=(EmployeeDao)ctx.getBean("edao"); List list=dao.getAllEmployees(); for(Employee e:list) System.out.println(e); } } 

和applicationContext2.xml

                

这些都是我正在使用的java文件。 它说setter的返回类型与getter不匹配,但我检查了它,并且它在那里是正确的。

问题在于

尝试将name="jdbcTemplate"更改为name="template" 。 由于您已将名称命名为jdbcTemplate,因此spring将在EmployeeDao类中搜索名为setJdbcTemplate()的setter方法,但您拥有的acutal方法是setTemplate()