java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean. ..期望单个匹配的bean,但发现12

标签 java spring hibernate generics dao

我正在创建一个程序,到目前为止大约有 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创建通用服务,这可能不是您想要的。还有一个建议:将 GenericDaoImplGenericServiceImpl 抽象化,这样就没有人尝试实例化它们。
并且不需要 @Qualifier@Primary

关于java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean. ..期望单个匹配的bean,但发现12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057282/

相关文章:

java - 生成 hibernate 实体的 ERD Eclipse 插件

java - 列表初始化错误

java - 在 Java 中下载 JNLP 文件

java - MySQL java 错误

javascript - 堆栈 ExtJS 6 + Spring Boot

hibernate - 当@Transactional 处于类级别时如何使用只读

java - 如果是视频,有没有办法检查 MultipartFile 上传的长度?

java - Hibernate:使用关联的 findByExample 条件

java - JPA 2.0 (Hibernate) 为 @OneToMany 和 @JoinTable 生成不正确的连接表 PK

java - 从数据库中获取值作为有序映射