Почему @Autowired не работает с generi c type T? - PullRequest
1 голос
/ 03 апреля 2020

У меня есть класс ниже, где я пытаюсь внедрить некоторую зависимость JpaRepository.

class Sample<T> implements SampleInterface<T> {
  @Autowired
  JpaRepository<T, Long> jpaRepository; // Want this to be injected by spring using A as entity
}


 class Main {
    @Bean
    Sample<A> sample() {
      return new Sample<A>(); // A is a jpa entity
    }
 }

Это потому, что аннотации анализируются во время компиляции? Почему пружина не может сделать автоподстройку динамической c с использованием дженериков? Возможно, мне не хватает основ, но любопытно восполнить этот пробел в знаниях.

1 Ответ

2 голосов
/ 11 апреля 2020

Причиной этого является стирание типа, которое происходит во время компиляции, в то время как внедрение бина происходит во время выполнения.

Поскольку на нем нет границ, T стирается и в основном заменяется на Object и Spring Data. невозможно создать репозитории для Object.

См. также Использование обобщений в репозиториях Spring Data JPA

...