这个错误要搞死我,对于java dynamic web的恨意大概都来源于此。
首先,看到这个错误先明确一定是applicationContext.xml配置出现了错误,而且应该是datasource中的bean的配置出现了问题。
bean配置有四层,除去sessionFactory那一层还应该有三层:action/dao/service。下面是每一层的一个bean配置为例,详细说明这种情况应该注意的点:
<bean id="usersAction" class="actions.UsersAction" scope="prototype">
<property name="usersService" ref="usersService"/>
bean>
<bean id="usersService" class="service.impl.UsersServiceImpl">
<property name="usersDao" ref="usersDao"/>
bean>
<bean id="usersDao" class="dao.impl.UsersDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
bean>
注意:
在action/ServiceImpl类中实例化的Service/Dao变量的名字应该与配置文件中指定的名字一样,其get与set方法也一定命名好(name还是ref我没有查…因为一直都是保持一样的,抱歉)。比如说,在上述例子中,在UsersAction中实例化了UsersService,实例化的变量命名与对应方法应该是这样:
//在UsersAction中
private UsersService usersService;
public void setUsersService(UsersService usersService){
this.usersService=usersService;
}
public UsersService getUsersService(){
return this.usersServce;
}
这里有一个建议,如果使用eclipse ee来编程,写完private UsersService usersService;这一句之后直接使用快捷键shift+alt+S,出现popup菜单,选择generate setters and getters直接选择你要为之生成set与get方法的变量即可,不用担心写错。毕竟这里参数命名太重要了。
去看一看:1.bean中的property中的名字配置与你在类中实例化参数命名是否一致。2.你实例化的参数有没有对应的set与get方法。3.你的set与get方法的命名与你直接使用快捷键generate的名字是不是一样的。
如果没有的话就extends一下就好,或者不用这个类的话,可以在DaoImpl类中定义sessionFactory这个参数(必须同名!!!),然后使用我上面说的shift+alt+S快捷键generate setter and getter的方法为之生成set与get方法。
参考:错误信息:Bean property ‘sessionFactory’ is not writable or has an invalid setter method.