BaseDaoImpl:
package com.erp.service.impl;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.erp.dao.BaseDao;
import com.erp.service.BaseService;
public class BaseServiceImpl<T,Q> implements BaseService<T, Q> {
//此处修饰符用默认
BaseDao<T, Q> baseDao;
@Override
public void save(T t) {
// TODO Auto-generated method stub
baseDao.save(t);
}
@Override
public void update(T t) {
// TODO Auto-generated method stub
baseDao.update(t);
}
@Override
public T get(Integer id) {
// TODO Auto-generated method stub
return (T) baseDao.get(id);
}
@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
baseDao.delete(id);
}
@Override
public List<T> queryEmpByCondition(Q q) {
// TODO Auto-generated method stub
return baseDao.queryEmpByCondition(q);
}
@Override
public List<T> list() {
// TODO Auto-generated method stub
return baseDao.list();
}
}
错误示例:
package com.erp.service.impl;
import com.erp.dao.EmpDao;
import com.erp.model.Emp;
import com.erp.query.EmpQuery;
import com.erp.service.EmpService;
public class EmpServiceImpl extends BaseServiceImpl<Emp, EmpQuery> implements
EmpService{
private EmpDao empDao;
public void setEmpDao(EmpDao empDao) {
this.empDao = empDao;
//不注册baseDao报空指针异常
//this.baseDao = empDao;
}
}
如果baseDao没有注册,会报空指针异常
正确示例:
package com.erp.service.impl;
import com.erp.dao.EmpDao;
import com.erp.model.Emp;
import com.erp.query.EmpQuery;
import com.erp.service.EmpService;
public class EmpServiceImpl extends BaseServiceImpl<Emp, EmpQuery> implements
EmpService{
private EmpDao empDao;
public void setEmpDao(EmpDao empDao) {
this.empDao = empDao;
//不注册baseDao报空指针异常
this.baseDao = empDao;
}
}
原因分析:
EmpServiceImpl的对象(empService)方法被调用时,因为EmpServiceImpl类中并没有定义方法,方法BaseServiceImpl中定义,empService调用父类的方法,父类的方法都是有BaseDao类的具体对象实现,此时,spring容器并没有baseDao的bean,baseDao是null.
解决办法是,spring容器管理empService时,在setEmpDao方法中,用多态的方式把empDao赋值给baseDao,解决空指针异常.