Я настраиваю многомодульный подпружиненный проект, имеющий следующую структуру:
- root
- core (с классом TestingHandler, добавляющим TestingRepository для сохранения данных)
- persistence-api (с пользовательским интерфейсом хранилища TestingRepository)
- persistence-memory (с абстрактным классом MemoryTestingRepository, расширяющим как TestingRepository, так и JpaRepository)
- main (с точкой входа приложения ибегун, который вызывает TestingHandler для сохранения данных)
Я пытаюсь создать простое приложение с весенней загрузкой, которое сохранит пример записи в своей h2 in-mem db.но я продолжаю получать следующую ошибку:
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.****.***.services.testing.persistence.memory.MemoryTestingRepository' in your configuration.
Что мне не хватает?
Я пробовал следующее:
- Не используется иерархия репозитория.Просто с помощью одного интерфейса, который расширяет
JpaRepository
, и он работает, но у меня должна быть иерархия интерфейса из-за пользовательских методов и необходимости поддержки нескольких реализаций БД в будущем. - попытался использовать MemoryRepository непосредственно в TestingHandler, неРабота.Если я преобразовываю MemoryRepository в интерфейс (и избавляюсь от пользовательских методов), это работает.но, как я уже говорил, мне нужен собственный метод и поддержка иерархии интерфейса для поддержки унаследованного кода.
- много пытался играть с аннотациями, такими как @EnableJpaRepositories, @ComponentScan и т. д., без помощи.
- Testing.java - довольно стандартный POJO с аннотацией @Entity и @Id, очень простой.
Вот класс Handler:
package com.***.**.services.testing.core;
@Service
public class TestingHandler {
@Autowired
private TestingRepository testingRepository;
@NotNull
public Testing create(@NotNull final TestingDto testingDto) {
Testing testing = new Testing("123", testingDto.getName(), testingDto.getDescription(), testingDto.Key(), testingDto.getVersion());
testingRepository.create(testing);
return testing;
}
}
Обратите внимание, что он вводит интерфейс TestingRepository.
Вот интерфейс TestingRepository (простой и простой):
package com.***.**.services.testing.persistence.api;
@Repository
public interface TestingRepository {
void create();
void findByCustomAttr();
}
Вот класс impl TestingRepository:
package com.***.**.services.testing.persistence.memory;
@Repository
public abstract class MemoryTestingRepository implements JpaRepository<Testing, Integer>, TestingRepository {
@Override
public void create(@NotNull Testing testing) {
save(testing); //the real jpa method called.
}
@Override
public void findByCustomAttr(){
//some impl....
}
}
наконец, основной класс выглядитвот так:
package com.***.**.services.testing.main;
@SpringBootApplication(scanBasePackages = "com.***.**.services.testing")
@EnableJpaRepositories("com.***.**.services.testing.persistence")
@EntityScan(basePackages = {"com.***.**.services.testing.persistence"})
public class TestingApplication {
public static void main(String[] args) {
SpringApplication.run(TestingApplication.class, args);
}
}
У меня также есть класс runner, который вызывает метод обработчика:
package com.***.**.services.testing.main;
@Component
public class TestingService implements CommandLineRunner {
@Autowired
private TestingHandler testingHandler;
@Override
public void run(final String... args) throws Exception {
test();
}
public void test() {
testingHandler.create(new TestingDto("name", "desc", "some_mapping_id", Version.create()));
}
}
Есть ли указатели?