今天在整合spring+springMVC+hibernate的时候遇到了一个问题:
  首先,先说背景,我在dao层和service层以及controller层都新建了一个基类,其他类都继承各自层的基类,基类中写好了一些通用方法,类似于初学时的BaseDao。
  问题:我用springMVC扫描的controller,spring扫描的service,然后再controller中注入service的实现类,子类controller代码如下:
@Controller
public class UserController extends BaseController<User>{    @Autowired   //此处标志为1
    public void setUserService(UserService userService) {
        this.setBaseService(userService);
    }
}基类controller层代码如下
public class BaseController<T> {    private BaseService<T> baseService;    public void setBaseService(BaseService<T> baseService) {
        this.baseService = baseService;
    }    public BaseService<T> getBaseService() {
        return baseService;
    }    public void save(T t){
        this.getBaseService().save(t);
    };
}
基类service层代码:
public abstract class BaseService<T> {    private Class<T> tClass;    @SuppressWarnings("unchecked")
    public BaseService() {
        try {
            Class cls = getClass();
            while (!(cls.getGenericSuperclass() instanceof ParameterizedType)) {
                cls = cls.getSuperclass();
            }
            if (cls != null)
                tClass = (Class<T>) ((ParameterizedType) cls.getGenericSuperclass())
                        .getActualTypeArguments()[0];
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    private BaseDao<T> baseDao;    public void setBaseDao(BaseDao<T> baseDao) {
        this.baseDao = baseDao;
    }    public BaseDao<T> getBaseDao() {
        return baseDao;
    }    public void save(T t){
        this.getBaseDao().save(t);
    };
}
基类dao层代码如下:
public abstract class BaseDao<T> extends HibernateDaoSupport{    private Class<T> tClass;    @SuppressWarnings("unchecked")
    public BaseDao() {
        try {
            Class cls = getClass();
            while (!(cls.getGenericSuperclass() instanceof ParameterizedType)) {
                cls = cls.getSuperclass();
            }
            if (cls != null)
                tClass = (Class<T>) ((ParameterizedType) cls.getGenericSuperclass())
                        .getActualTypeArguments()[0];
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    @Autowired
    public void setSessionFactory0(SessionFactory sessionFactory)
    {
        setSessionFactory(sessionFactory);
    }
    public void save(T t){
        try {
            this.getSessionFactory().getCurrentSession().save(t);
        } catch (RuntimeException re) {
            re.printStackTrace();
        }
    };
}
如果上面1中我不加@Autowired,可以启动,但是在controller层直接调用基类中的方法时,会报空指针异常,因为baseService是null。如果我加了,启动时报找不到相关的service。求助大神们!配置文件如下:
applicationcontext.xml
<!-- 自动扫描 -->
    <context:component-scan base-package="com.wen.dao.impl,com.wen.service.impl">
    </context:component-scan>
spring-mvc.xml
<mvc:annotation-driven />
    <context:component-scan base-package="com.wen.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>

解决方案 »

  1.   

    检查下你UserService是否加了@service的注解
      

  2.   

    可以首先判断扫描到了没,可以在userService添加构造方法测试,然后看注入是否正确;
      

  3.   

    注入是好的。
    只是我在service中有下面这段代码,确保了我的basedao有值    @Autowired
        public void setUserDao(UserDao userDao) {
            this.setBaseDao(userDao);
        }
     但是我在controller中使用如下代码:
        @Autowired
        public void setUserService(UserService userService) {
            this.setBaseService(userService);
        }
    只要加了这个@Autowired,就无法启动,报如下错:
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through method 'setUserService' parameter 0: 
    No qualifying bean of type [com.wen.service.impl.UserService] found for dependency [com.wen.service.impl.UserService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {};