Я занимаюсь разработкой приложения SpringBoot (например MyApp) с зависимостью к двум проектам данных с различной реализацией:SpringBoot: Может не Autowire класса из других библиотек Jar
данных jdbc.jar
- построен с использованием
spring-boot-starter-jdbc
, которое обнажает класс JDBCDataService, который будет использоваться моим приложением
Пример кода :
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
- с пакетом
my.data.jdbc
- нет SpringBoot основного класса. конфигурации Spring созданы только для модульного тестирования классов
- классов хранилища использует
JDBCTemplate
Sample Repository:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
данные jpa.jar
- построен используя
spring-boot-starter-data-jpa
, который также экспонирует эс класс JPADataService, который также будет использоваться моим приложением
Пример код:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
- с пакетом
my.data.jpa
- нет SpringBoot основного класса. конфигурации Spring создается только для модульного тестирования классов
- классов хранилища расширяет интерфейс
CrudRepository
Sample Repository:
@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"
, которая существует только для класса JPADataService
, но работает отлично для JDBCService
класса.
Я попробовал найденное решение в следующих вопросах, но ни один из них не работает в моем случае:
Can't I @Autowire a Bean which is present in a dependent Library Jar?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
How can I @Autowire a spring bean that was created from an external jar?
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
Теперь я нашел решение по моей проблеме. Мне нужно повысить уровень моего первого уровня MyApp.java на одном уровне, чтобы сканировать мои библиотеки данных.
Вместо того, чтобы мой MyApp.java
под my.app
пакет, я должен переместить его под my
для того, чтобы успешно сканировать свои библиотеки с my.data.jpa
и my.data.jdbc
пакетов.
'@ ComponentScan' будет работать только в том случае, если класс' JPADataService' аннотируется с помощью '@ Component'. Вам нужно добавить аннотированный метод '@ Bean' в ваш класс' @ Configuration'. http://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html –
@ Кристофер Шнайдер, оба класса обслуживания в обоих файлах jar фактически аннотируются с помощью ' @ 'обслуживания. AFAIK, '@ ComponentScan' должен также иметь возможность читать эти классы. – Jown
@ Служба должна позаботиться об этом. Вы говорите, что у вас нет основного класса, так где же точка входа в приложение? –