我正在创建一个程序,到目前为止大约有 12 个 DAO 和服务。 DAO 和服务基本上是相同的,因此我构建了一个通用的 DAO 和服务,并由我制作的 12 个 DAO 和服务进行了扩展,以便它们都可以访问保存、更新、删除和 findById。每当我只使用 1 个类进行测试 (RegularUser
) 时,一切都工作正常,但是当我将所有类切换到扩展通用 DAO 和服务时,我收到此错误:
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'genericServiceImpl' defined in file [C:\Users\Contronym\workspace\Glimps App\target\classes\com\glimpsmedia\app\generic\service\GenericServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type [com.glimpsmedia.app.generic.dao.GenericDao] is defined: expected single matching bean but found 12: businessCategoryDaoImpl,businessUserDaoImpl,campaignCategoryDaoImpl,campaignDaoImpl,competitorDaoImpl,followDaoImpl,friendDaoImpl,giveawayDaoImpl,glimpsDaoImpl,regularUserDaoImpl,userCategoryDaoImpl,viewDaoImpl; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.glimpsmedia.app.generic.dao.GenericDao] is defined: expected single matching bean but found 12: businessCategoryDaoImpl,businessUserDaoImpl,campaignCategoryDaoImpl,campaignDaoImpl,competitorDaoImpl,followDaoImpl,friendDaoImpl,giveawayDaoImpl,glimpsDaoImpl,regularUserDaoImpl,userCategoryDaoImpl,viewDaoImpl
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.glimpsmedia.app.main.App.main(App.java:14)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.glimpsmedia.app.generic.dao.GenericDao] is defined: expected single matching bean but found 12: businessCategoryDaoImpl,businessUserDaoImpl,campaignCategoryDaoImpl,campaignDaoImpl,competitorDaoImpl,followDaoImpl,friendDaoImpl,giveawayDaoImpl,glimpsDaoImpl,regularUserDaoImpl,userCategoryDaoImpl,viewDaoImpl
at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:172)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1059)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
... 15 more
我的通用 DAO:
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory sessionFactory;
private final Class<T> type;
public GenericDaoImpl(final Class<T> type) {
this.type = type;
}
public void save(final T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void update(final T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void delete(final T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public T findById(final long id) {
Session session = sessionFactory.openSession();
Transaction tx = null;
T obj = null;
try {
tx = session.beginTransaction();
obj = session.get(type, id);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return obj;
}
}
我的通用服务:
@Service
@Transactional
public class GenericServiceImpl<T> implements GenericService<T> {
private GenericDao<T> dao;
@Autowired
public GenericServiceImpl(GenericDao<T> dao) {
this.dao = dao;
}
public void save(T obj) {
dao.save(obj);
}
public void update(T obj) {
dao.update(obj);
}
public void delete(T obj) {
dao.delete(obj);
}
public T findById(long id) {
return dao.findById(id);
}
}
此外,这里还有一个 DAO 的示例。除了类名之外,它们都是相同的(有 12 个):
@Repository("regularUserDaoImpl")
public class RegularUserDaoImpl extends GenericDaoImpl<RegularUser>
implements RegularUserDao {
public RegularUserDaoImpl() {
super(RegularUser.class);
}
}
还有一个服务示例(同样,有 12 个服务,每个 DAO 一个):
@Service("regularUserServiceImpl")
@Transactional
public class RegularUserServiceImpl extends GenericServiceImpl<RegularUser>
implements RegularUserService {
public RegularUserServiceImpl(GenericDao<RegularUser> dao) {
super(dao);
}
}
我尝试对此进行一些研究,并看到了一些有关 @Qualifier
标记的内容,但我不知道如何在这里实现它,因为 @Autowired
通用类中的标记有 12 个不同的选项可供选择,所以我不知道要在 @Qualifier
中放入什么内容,也不知道如何使 @Qualifier
动态化。
最佳答案
从GenericServiceImpl
中删除@Service
注释,它告诉Spring使用通用DAO创建通用服务,这可能不是您想要的。还有一个建议:将 GenericDaoImpl
和 GenericServiceImpl
抽象化,这样就没有人尝试实例化它们。
并且不需要 @Qualifier
或 @Primary
。
关于java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean. ..期望单个匹配的bean,但发现12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057282/