gpt4 book ai didi

使用独特的 bean 进行 Spring Autowiring : Spring expected single matching bean but found 2

转载 作者:IT老高 更新时间:2023-10-28 13:04:06 25 4
gpt4 key购买 nike

我正在尝试使用 Spring 为 webapp Autowiring 一些 bean(用于依赖注入(inject))。一个 Controller bean 包含另一个 bean,后者又持有另一组 bean 的 HashMap 。目前该 map 只有一个条目。当我在 tomcat 中运行并调用服务时,我收到一条错误消息,指出第二个 bean(保存在 Controller 中)不是唯一的

No unique bean of type [com.hp.it.km.search.web.suggestion.SuggestionService] is defined: expected single matching bean but found 2: [suggestionService, SuggestionService]

我看不到我在哪里定义了两次 bean,但是我是 Spring 和 Autowiring 的新手,所以我可能会遗漏一些基本的东西。下面列出的 xml 和 2 个类的源代码...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="com.hp.it.km.search.web.suggestion" />
<mvc:annotation-driven />
<context:annotation-config />

<bean id="SuggestionController" class="com.hp.it.km.search.web.suggestion.SuggestionController">
<property name="service">
<ref bean="SuggestionService" />
</property>
</bean>

<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService">
<property name="indexSearchers">
<map>
<entry key="KMSearcher"> <ref bean="KMSearcherBean"></ref></entry>
</map>
</property>
</bean>

<bean id="KMSearcherBean" class="com.hp.it.km.search.web.suggestion.SuggestionIndexSearcher">
<constructor-arg index="0" value="KMSearcher" />
<constructor-arg index="1" value="C://dev//workspace//search-restful-webapp//src//main//resources//indexes//keyword" />
</bean>

带有 Autowiring Controller 和服务 bean 的类 asscoaites 在这里...

@Controller
public class SuggestionController {
private SuggestionService service;

@Autowired
public void setService(SuggestionService service) {
this.service = service;
}

public SuggestionService getService() {
return service;
}

还有……

@Component
public class SuggestionService {

private Map<String, IndexSearcher> indexSearchers = new HashMap<String, IndexSearcher>();

@Autowired
public void setIndexSearchers(Map<String, IndexSearcher> indexSearchers) {
this.indexSearchers = indexSearchers;
}

public SuggestionService() {
super(); }

请帮忙!

最佳答案

问题是因为您有一个 SuggestionService 类型的 bean,它是通过 @Component 注释和 XML 配置创建的。正如 JB Nizet 所解释的,这将导致通过 @Component 创建一个名为“suggestionService”的 bean,并通过 XML 创建另一个名为“SuggestionService”的 bean。

当您通过 @Autowired 引用 SuggestionService 时,在您的 Controller 中,Spring 默认“按类型”自动连接,并找到两个类型为“SuggestionService”的 bean

您可以执行以下操作之一

  1. 从您的服务中移除 @Component 并依赖于通过 XML 的映射 - 最简单

  2. 从 XML 中移除 SuggestionService 并 Autowiring 依赖项 - 使用 util:map 注入(inject) indexSearchers 映射。

  3. 使用@Resource 而不是@Autowired 来按名称选择bean。

     @Resource(name="suggestionService")
    private SuggestionService service;

    @Resource(name="SuggestionService")
private SuggestionService service;

两者都应该可以。第三个是脏修复,最好通过其他方式解决bean冲突。

关于使用独特的 bean 进行 Spring Autowiring : Spring expected single matching bean but found 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8414287/

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