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 пакеты.