java - 将 JpaRepository 注入(inject) Generic 类时出现 NoUniqueBeanDefinitionException

标签 java generics spring-boot autowired

如何将存储库注入(inject)泛型类?

public class FruitComboBox<T extends Fruit> extends ComboBox {

    @Autowired
    private JpaRepository<T, Integer> repository;
    ...
}

public class FruitMarket {

    @Autowired
    FruitComboBox<Apple> appleCombobox; // Apple extends Fruit

    @Autowired
    FruitComboBox<Orange> orangeCombobox; // Orange extends Fruit

    ...
}

我还有两个存储库

@Repository
public interface AppleRepository extends JpaRepository<Apple, Integer> {
}

@Repository
public interface OrangeRepository extends JpaRepository<Orange, Integer> {
}

我认为 FruitComboBox 中的通用存储库应该根据其 T 解析为两个现有存储库之一,并由 Spring Autowiring 。

NoUniqueBeanDefinitionException:预期有单个匹配 bean,但发现 2 发生在运行时(而不是在应用程序启动时)。所以我假设在运行时所有类型都已定义并且 Spring 已经知道 T 是什么具体类型。

最佳答案

Spring 数据需要在引导时知道存储库代表的实体。这意味着您不能在 Autowiring 期间将其保留为通用参数

创建一个单独的界面,如下所示。

@Repository
public interface MyGenericRepository<T> extends JpaRepository<T, Integer>{

}

现在您应该能够使用明确的类型(而不是泛型类型) Autowiring 它。这很通用。

@Autowired
private MyGenericRepository<Apple, Integer> repository;

以上不能留泛型参数。

引用http://docs.spring.io/spring-data/jpa/docs/1.6.5.RELEASE/reference/html/repositories.html

还尝试使用 Long 作为 ID。

关于java - 将 JpaRepository 注入(inject) Generic 类时出现 NoUniqueBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748960/

相关文章:

java - java中xpath的问题

c# - 如何允许 C# 8 中可为 null 的泛型类型作为方法的返回类型?

java - 在 spring boot 项目中使用 spring eclipse sts 逆向工程数据库表

java - 我的主应用程序菜单无法打开

java - Add 方法不适用于 String 类型的 ArrayList

java - 如何修复 Atomikos JTA 和 Hibernate 的 Spring 配置?

c++ - Rust 中泛型的单独编译

java - Spring 中的 Java 通用语法是什么?

java - spring data mongodb调用save两次导致重复键异常

java - 使用 Gmail 从 Spring Boot 应用程序发送电子邮件