spring4.2.8+tomcat8+jdk1.8启动失败

MY1024K 发布于 2016/12/27 15:43
阅读 780
收藏 1

各位大牛,我项目是struts2+spring4.2.8+hibernate,原来是jdk1.7,tomcat7.0.67,正常启动没有问题,现在由于部分原因要进行升级到jsk1.8,tomcat8,但是启动时候就报错,项目其他的类似appDaoImpl都是继承于baseDaoImpl

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.sdjz.eshop.dao.BaseDao] is defined: expected single matching bean but found 109: appDaoImpl,baseDaoImpl......
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1133)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1021)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:508)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:486)

其中/**
 * Dao实现类 - Dao实现类基类
 * 
 */
@Repository
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {


private Class<T> entityClass;
protected SessionFactory sessionFactory;

。。。

}


@Repository
public class AppDaoImpl extends BaseDaoImpl<App, String> implements AppDao {


}


以下是问题补充:

@MY1024K:谢谢大家了。。。 (2016/12/27 15:44)
加载中
0
跳不动的马小跳
NoUniqueBeanDefinitionException 去掉BaseDaoImpl.class 的@Resource注解
0
MY1024K
MY1024K

引用来自“跳不动的马小跳”的评论

NoUniqueBeanDefinitionException 去掉BaseDaoImpl.class 的@Resource注解
还是不行,是不是我的每个service里面这样写的有问题
@Service
public class AppServiceImpl extends BaseServiceImpl<App, String> implements AppService {


@Resource
private AppDao appDao;


@Resource
public void setBaseDao(AppDao appDao) {
super.setBaseDao(appDao);
}


}
MY1024K
MY1024K
回复 @跳不动的马小跳 : 没有加呢
跳不动的马小跳
你的BaseServiceImpl是不是也加了注解
0
一只小桃子
一只小桃子

你有的地方注解了com.sdjz.eshop.dao.BaseDao   但是这个是个抽象类,实现类有好多个,你没有指定到底注解哪个。

不知道你这个@Resource是spring的还是 java规范里的。如果是spring的,可以在加个名字@Qualifier("implName") 里面填实现类的名字

MY1024K
MY1024K
是java的@Resource ,但是为什么原来在jdk1.7+tomcat7下运行没有问题呢
0
流浪的木马
流浪的木马

这是因为,你1个接口,有2个实现类

spring自动注入发生了歧义

要么删除一个,要么使用限定符,告诉spring注入一个

0
MY1024K
MY1024K

引用来自“流浪的木马”的评论

这是因为,你1个接口,有2个实现类

spring自动注入发生了歧义

要么删除一个,要么使用限定符,告诉spring注入一个

我项目基础架构是:

public interface BaseDao<T, PK extends Serializable> {

.......

}

@Repository
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {
private Class<T> entityClass;
protected SessionFactory sessionFactory;

.......
}



public interface BaseService<T, PK extends Serializable> {
.....

}

public class BaseServiceImpl<T, PK extends Serializable> implements BaseService<T, PK> {


private BaseDao<T, PK> baseDao;


public BaseDao<T, PK> getBaseDao() {
return baseDao;
}


public void setBaseDao(BaseDao<T, PK> baseDao) {
this.baseDao = baseDao;
}

....
}

自己业务类:

public interface AppDao extends BaseDao<App, String> {}


@Repository
public class AppDaoImpl extends BaseDaoImpl<App, String> implements AppDao {}

public interface AppService extends BaseService<App, String> {

...

}

@Service
public class AppServiceImpl extends BaseServiceImpl<App, String> implements AppService {
@Resource
private AppDao appDao;
@Resource
public void setBaseDao(AppDao appDao) {
super.setBaseDao(appDao);
}


}
我现在比较纠结的是:AppServiceImpl  里面setBaseDao 上面是j2ee的@Resource,项目在jdk1.7+tomcat7下运行正常;但是现象升级到jdk1.8+tomcat8,启动时候就报错了,如果改成@Autowired  或者 @Resource(name="appDaoImpl") 就没有问题了,是在是搞不明白了!

0
秋痕
秋痕
把 BaseDaoImpl 类上的@Repository  去掉
返回顶部
顶部