今天在整合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>
首先,先说背景,我在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>
解决方案 »
- 想学一下struts1,求指点
- 请教高手们一个关于mysql的问题
- 求救: gsoap对数组类型的使用
- 关于脱机群的问题,高分!
- 帮忙看下这是什么原因?
- 求简单的源代码....(机j2ee模式开发web程序,简单的,可运行就行,分不够,可以在加!,帖子也可以啊!)
- 100分请教一个问题
- jdbc 连接问题,在线等待!!!!!!!
- 在jb中bmp的测试程序出错!!
- 请各位java高手谈谈java结合xml的用法,谢谢,来者有分!!
- 桌面文件怎么拖到虚拟机
- springMVC拦截器配置一个不拦截的url,使用localhost:8080就可以直接访问,换成127.0.0.1:8080就会被拦截,这是怎么回事啊
只是我在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: {};