java 如何解决“org.springframework.beans.factory.NoUniqueBeanDefinitionException”

8qgya5xd  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(179)

我在Spring项目中有这样的结构:

class A {
   public void first(){
   }
}

class B extends A {
   public void first(){
   }
}

我想根据条件调用类A或类B的第一个方法,但我得到了这个异常“Caused by:org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有类型为“com.code.A”的合格Bean可用:预期有一个匹配的bean,但找到了% 2:B,A“在Spring。
我试着添加@Qualifier和其他东西,但没有任何工作,有人可以建议任何改变吗?

oxcyiej7

oxcyiej71#

如果使用Annotation将bean放入spring上下文中,可以尝试用不同的名称重命名这些bean,例如@Component(value=“classA”),这样spring将识别这两个类,它们是公共类中的子类;
一般来说,我们经常定义一个抽象的接口,用于其他目的而不是类的子类化。如果你像上面这样重构你的代码,你将减少发生错误的风险,比如spring上下文中的bean不是唯一的。

zvms9eto

zvms9eto2#

您的用例和代码示例没有充分解释您试图实现的目标。你能详细说明一下吗?
您的first方法不能是bean,因为它们返回void。如果要存储示例,则:

@Component
class A {
   public void first(){
   }
}

@Component
class B extends A {
   public void first(){
   }
}

这段代码将告诉Spring创建并存储每个A & B的单例示例(在名称A & B下)到Spring上下文中。然后Spring可以在需要的地方注入这些示例:

@Component
class C {

    private final A instanceA;
    private final B instanceB;

    @Inject
    private void setInstanceA( A a ) {
        this.instanceA = a;
    }
    @Inject
    private void setInstanceB( B b ) {
        this.instanceB = b;
    }

    public void myMethod() {
        //call a.first() or b.first();
    }
}

如果你详细说明你想达到什么目标,你就更容易给予一个更好的答案。

相关问题