当前位置: 首页 > 知识库问答 >
问题:

尽管只有一个实现,但仍引发NonuniqueBeandDefinitionException

邓正真
2023-03-14

我有一个MyService类,它具有应该被注入的仓库字段。

public class Service {
    @Autowired
    private Repository repository;
// ...ommited
}

并且有MyRepositoryImpl接口仅由MyRepositoryImpl类实现,具有MyBatis@Mapper注释

public interface Repository {
// ...ommited
}

@Mapper
public class RepositoryImpl implements Repository {
// ...ommited
}

当我尝试启动SpringBootApplication时,会抛出NoniqueBeandDefinitionException

@SpringBootApplication(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
@MapperScan(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
(...omitted)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'com.example.MyService':
Unsatisfied dependency expressed through field 'repository'; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type 'com.example.MyRepository' available: 
expected single matching bean but found 2: com.example.MyRepositoryImpl,com.example.MyRepository
(...omitted)

为什么MyRepository接口注册为bean的一个,即使它没有@组件注释,也没有包含任何bean配置?

我发现,如果我不使用FullyQualifiedAnnotationBeanNameGenerator作为nameGenerator,一切都很好。

有什么想法吗?

共有2个答案

阎枫涟
2023-03-14

Spring无法确定哪个bean应该实现存储库接口。
将注释@存储库放在RepositoryImpl类上面。它会找到的。

严阳秋
2023-03-14

有许多其他方法可以将接口标记为bean。其中包括:

  1. @存储库原型注释(因为它是存储库接口,else@Service也在那里)
  2. @MyRepository接口上方的Repository定义
  3. MyRepository扩展了Crudepository或JpaRepository
 类似资料:
  • 我不确定我是否正确理解http-keep-alive,在我看来,它应该重用tcp连接,而不是构建一个新的连接。然而,我发现了一些非常奇怪的事情,似乎很难预料http keep-alive的行为。 服务器:NodeJS&Express^4.16.3,我使用Wireshark分析结果 情况1: null 客户端 null 情况2: null 结果:建立了另外5个tcp连接(在图片中只有4个,因为屏幕截

  • 问题内容: 我不明白…是我还是这是节点中的错误? 可以按预期进行: 这发出了警告: 我懂了 问题答案: 使用与承诺回报新希望(这就是所谓的链接)。因此,当您执行以下操作时: 您的最初承诺在哪里,您将在第1行上创建一个新的承诺(现在不再存在。我们称它为 )。因此,即使您使用with ,也不会处理上的拒绝,这解释了您在控制台上看到的消息。 为了避免出现此消息,您应该在第1行的新承诺中添加a

  • 问题内容: 我有一个在MySQL 5.6上运行良好的存储过程。在最近的服务器迁移中,我们升级到MySQL 5.7.19。 我的存储过程现在抛出错误: 我已经设置了对通过文件,重新启动mysql服务,并通过控制台,以确认登录的通过是空白 尽管如此,当我尝试运行存储过程时,我仍然收到上述错误。 接下来,我该怎么办才能继续排除错误的出处? 问题答案: 根据文档,MySQL使用创建该过程时处于活动状态的s

  • 问题内容: 我收到错误消息: 致命错误:尚未实现init(coder :) 按照我的习惯。该单元未注册,在情节提要中和使用dequeasreusablecell时具有标识符 单元 。在自定义单元格中,我的初始化为: 码: 但是我仍然有错误。谢谢。 问题答案: 将您的init替换为coder方法: 实际上,如果您在Storyboard中创建了单元格- 我认为应该将其附加到尝试在其上创建它的table

  • 问题内容: 我一直读到魔术引号根本不能停止SQL注入,但是我不明白为什么不这样做!例如,假设我们有以下查询: 现在,如果用户输入make ,则查询将是: 反斜杠将由Magic Quotes添加,而不会造成任何损害! 有没有办法我看不到用户可以在此处绕过Magic Quote插入的地方? 问题答案: 技巧通常是传递一个二进制值,以使反斜杠成为有效的多字节字符的一部分。这是关于它的博客文章。