gpt4 book ai didi

java - org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException

转载 作者:行者123 更新时间:2023-11-30 02:03:12 32 4
gpt4 key购买 nike

如何解决Spring中Bean的自动连接歧义?我们有一个 Dessert 接口(interface),并且有实现该接口(interface)(Dessert)的三种不同的甜点(Bean)。

今天的甜点是 Cookie,因此我们用 @Primary 将其记为最爱。

问题是甜点已经做好了,如果有人想重复甜点,就不会再有 cookies 了,所以我们为那些想要重复甜点的人创建了“repeatDessert”。

除了最喜欢的甜点外,还有两种甜点,蛋糕和冰淇淋。我们希望每个重复的人都能得到冰淇淋甜点,我们已经足够了。

我们如何告诉 Spring 我们希望它提供两种甜点中的哪一种?

public interface Dessert {
void eat();
}

bean 饼:

@Component
public class Cake implements Dessert{

private Dessert repeatDessert;

public Dessert getRepeatDessert() {
return repeatDessert;
}

@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

@Override
public void eat() {
System.out.println("Eating a Cake !!!!");
}
}

bean cookies :

@Component
@Primary
public class Cookie implements Dessert{

private Dessert repeatDessert;

public Dessert getRepeatDessert() {
return repeatDessert;
}

@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

@Override
public void eat() {
System.out.println("Eating a Cookie !!!!");
}
}

bean 冰淇淋:

@Component
public class IceCream implements Dessert{

private Dessert repeatDessert;

public Dessert getRepeatDessert() {
return repeatDessert;
}

@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

@Override
public void eat() {
System.out.println("Eating a IceCream !!!!");
}
}

这将是配置文件:

@Configuration
@ComponentScan
public class AutoBeanConfiguration {

}

这将是主类:

public class Main {

public static void main(String[] args) {
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
AnnotationConfigApplicationContext ctxt = new AnnotationConfigApplicationContext(AutoBeanConfiguration.class);
Cookies cookies = ctxt.getBean(Cookies.class);
cookies.eat();
Dessert dessert = cookies.getRepeatDessert();
dessert.eat();
ctxt.close();
}

}

程序抛出以下异常:

Exception in thread "main" Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cookies': Unsatisfied dependency expressed through method 'setRepeatDessert' parameter 0;
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'Dessert' available: expected single matching bean but found 2: cake,iceCream

当我们想要重复时,我们如何解决歧义并告诉 spring 我们想要创建哪些甜点?

控制台输出应该是这样的:

Eating a Cookies !!!!
Eating a IceCream !!!!

最佳答案

首先,您的代码有编译错误。请更改此代码

Cookies cookies = ctxt.getBean(Cookies.class);

Cookie cookie = ctxt.getBean(Cookie.class);

然后在你的bean类中,所有setter方法都与repeatDessert同名。所以这会找到任何与该名称相同的重复甜点 bean 。所以这无法找到任何带有 this 的 bean。在你的类的 bean setter 方法中;

@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

方法参数repeatDessert没有指定到哪个bean。如果您使用Qualifier更改所有bean类。 Read more detail about Qualifier ;

对于Cake.class

@Autowired
@Qualifier("cake")
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

对于IceCream.class

@Autowired
@Qualifier("iceCream")
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

对于Cake.class

@Autowired
@Qualifier("cake")
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}

现在您的 Spring 项目可以运行了。但你的结果我认为不能产生。因为你的 main 中没有任何有关冰淇淋的信息,只有 Cookie 但你想打印 Eating a IceCream !!!!! 。我从你的输出中不明白。如果这不能解决您的问题,您能提供吗?

PS:如果你想改变你的类的repeatDessert,你可以用@Qualifier("yourBeanName");来改变,你可以提供任何东西的可重复沙漠.

关于java - org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52141390/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com