将JpaRepository注入Generic类时出现NoUniqueBeanDefinitionException

时间:2016-04-20 15:46:50

标签: java generics spring-boot autowired

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

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自动装配。

NoUniqueBeanDefinitionException:预期的单个匹配bean但发现2 在运行时发生(不是在应用程序启动时)。所以我认为在运行时所有类型都已定义,Spring知道具体类型是T.

1 个答案:

答案 0 :(得分:0)

Spring数据需要在引导时知道存储库所代表的实体。这意味着您无法在自动装配期间使用Generic Parameter保留它。

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

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

}

现在你应该能够使用明确的类型(非通用类型)自动装配它。这是通用的。

@Autowired
private MyGenericRepository<Apple, Integer> repository;

以上不能保留通用参数。

参考http://docs.spring.io/spring-data/jpa/docs/1.6.5.RELEASE/reference/html/repositories.html

还尝试使用Long作为ID。