【问题标题】:Id for Spring Bean/RepositorySpring Bean/存储库的 ID
【发布时间】:2017-12-07 07:57:01
【问题描述】:

我有一个存储库 B,我从另一个存储库 A 扩展而来。

存储库 A:

@Repository
public class RepositoryA implements Repository {

}

存储库 B:

@Repository
public class RepositoryB extends  RepositoryA implements RepositoryAux{
}

但是当我尝试注入存储库时,我遇到了以下错误:

没有定义类型 [Repository] ​​的唯一 bean:预期的单个匹配 bean 但找到了 2:[RepositoryA , RepositoryB]

我知道我可以使用注解@Qualifier 来解决它。但是,我的问题是:

  1. 是不是覆盖了子类中的注解@Repository?

  2. 我可以为子类分配一个新的标识符吗?而不是使用注解@Qualifier,像@Id 或@Name 之类的东西

提前致谢

【问题讨论】:

  • 您的问题不清楚。 --- 1) “覆盖”@Repository 是什么意思? @Qualifier 注释必须除了 @Repository 注释之外,而不是代替。 --- 2) @Qualifier 与记录/行标识符(字段/列)无关。
  • FWIW XXXRepository 与 JPA API 无关,与 Spring Data JPA 无关。更正标记

标签: java spring hibernate jakarta-ee spring-data-jpa


【解决方案1】:
  1. 是不是覆盖了子类中的注解@Repository?

您应该考虑以下几点:

一个。如果您打算使用RepositoryA 作为存储库,那么您需要同时使用@Repository

b.如果您打算使用RepositoryA 只是为了提供基本功能以便RepositoryB(或其他类)可以扩展它,那么将RepositoryA 抽象并使用NoRepositoryBean 进行注释

c。或者,您可以使用“组合优于继承”原则。简而言之,您可以将RepositoryA 注入RepositoryB 并创建外观或包装方法来访问RepositoryB 实例上的方法。

  1. 我可以为子类分配一个新的标识符吗?而不是使用注解@Qualifier,@Id 或@Name 之类的东西

我认为您的意思是 @Named 来自 javax.inject.Named 基本上等同于 @Qualifier

我认为您的意思是 <bean id='...' 在这种情况下 @Qualifier 是处理注释的方式。见spring's documentation

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 2021-06-09
    • 2018-08-09
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多