Я хотел бы автоматически связать CrudRespository<Type,Key>
в абстрактном родительском классе, а затем использовать его с дочерними классами.Ошибка говорит мне:
java.lang.IllegalStateException: Failed to load ApplicationContext
[...]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'accountExtractor': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.data.repository.CrudRepository<com.finnwa.adwords.adconnect.Account, java.lang.Long>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Абстрактный родительский элемент, определяющий зависимость.
@Component
public abstract class Extractor<T,KEY> {
@Autowired
protected CrudRepository<T,KEY> repository;
// some business logic
}
Дочерний класс, предоставляющий параметры.
@Component
class AccountExtractor extends Extractor<Account, Long>{
// some config
}
Другие классы, которые могут иметь отношение:
public interface AccountRepository extends CrudRepository<Account, Long>{}
@SpringBootApplication
@EnableJpaRepositories(basePackages = "package.my")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
Из других вопросов я узнал, что зависимость в родительском классе может быть не частной.Поэтому я сделал это защищенным.Что-нибудь, что я пропускаю?
РЕДАКТИРОВАТЬ: Таким образом, Пол Янссенс и М. Дейнум опубликовали несколько хороших обходных путей.Но почему это не работает?Что здесь не так?