SpringBoot: не удается создать класс Autowire из другой библиотеки Jar
я разрабатываю приложение SpringBoot (например, MyApp) с зависимостью от двух проектов данных с различной реализацией:
data-jdbc.Джар
- построен с помощью
spring-boot-starter-jdbc
который предоставляет класс JDBCDataService, который будет использоваться моим приложением
Пример Кода:
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
- упаковка
my.data.jdbc
- нет основного класса SpringBoot. Только конфигурация пружины создано для классов модульных тестов
- классы репозитория используют
JDBCTemplate
Пример Репозитория:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
data-jpa.Джар
- построен с помощью
spring-boot-starter-data-jpa
который также предоставляет класс JPADataService, который также будет использоваться моим приложением
Пример Кода:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
- упаковка
my.data.jpa
- нет SpringBoot main класс. Конфигурация Spring создана только для классов модульных тестов
- классы репозитория расширяет
CrudRepository
интерфейс
Пример Репозитория:
@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
в моем проекте SpringBoot у меня есть следующее основное приложение SpringBoot:
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
в моем бизнесе MainService
класс, у меня есть следующая инъекция
@Service
public class MainServiceImpl implements MainService {
@Autowired
private JDBCDataService jdbcDataService;
@Autowired
private JPADataService jpaDataService;
тем не менее, я столкнулся с проблемой "Could not Autowire. No beans of 'JPADataService' type found"
, который существует только для класс!--16--> но работает нормально для JDBCService
класса.
я попробовал решение, найденное в следующих вопросах, но ни один из них не работает в моем случае:
не могу ли я @Autowire Боб, который присутствует в зависимой банке библиотеки?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
как я могу @Autowire весенний боб, который был создан из внешней банки?
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
теперь я нашел решение своей проблемы. Я должен двигаться вверх по моей основной Приложение myapp.java на один уровень пакета выше, чтобы сканировать мои библиотеки данных.
возврат MyApp.java
под my.app
пакет, я должен переместить его под my
для успешного сканирования моих библиотек с помощью my.data.jpa
и my.data.jdbc
пакеты.
2 ответов
добавление @ComponentScan не будет работать, если класс, который вы пытаетесь Autowire не аннотируется @Component. Чтобы заставить это работать, вам нужно будет аннотировать метод в вашем @Configuration
класса. Что-то вроде этого должно позволить вам autowire класс:
@Configuration
public class ConfigClass{
@Bean
public JPADataService jpaDataService(){
return new JPADataService();
}
}
теперь я нашел решение своей проблемы. Я должен поднять свой основной MyApp.java на один уровень пакета выше, чтобы сканировать мои библиотеки данных.
возврат MyApp.java
под my.app
пакет, я должен переместить его под my
для успешного сканирования моих библиотек с помощью my.data.jpa
и my.data.jdbc
пакеты.