ComponentScan и Autowired не работают для зависимого проекта Spring?

У меня есть два проекта A и B. Оба построены с помощью Maven, а проект A имеет зависимость Maven от проекта B. Оба проекта имеют класс с аннотацией @Configuration, где я определяю @Beans.

У меня есть бобы в проекте А из обоих проектов. Если я использую аннотацию @Autowired в проекте A компонента, который определен в том же проекте, автоматическое подключение работает. Однако, если я использую аннотацию @Autowired в проекте A bean-компонента из проекта B, я получу исключение.

Что это значит? Как я могу автоматически подключить bean-компонент в проекте A, который определен в проекте B?


person user1340582    schedule 09.02.2016    source источник
comment
какое исключение? У вас есть проект B, указанный как зависимость в вашем pom-файле проекта A? Находятся ли файлы jar проекта B в пути к классам для проекта A?   -  person obi1    schedule 09.02.2016


Ответы (1)


Обычно это проблема с базовым путем к классам на ComponentScan.

Если у вас, например, есть следующие базовые пакеты

com.myproject.a

и

com.myproject.b

в вашем проекте A и B соответственно, и вы используете SpringBoot с основным классом

package com.myproject.a

@Configuration 
@EnableAutoConfiguration 
@ComponentScan
class MyApp {
    // Some public static void main ... 
}

он найдет ваши классы только в пакете com.myproject.a и его дочерних элементах.

Чтобы решить эту проблему, вы должны улучшить @ComponentScan таким образом, чтобы он сканировал обе структуры пакета, например.

package com.myproject.a

@Configuration 
@EnableAutoConfiguration 
@ComponentScan(basePackages = {"com.myproject.a", "com.myproject.b"} 
// or basePackages = "com.myproject" in this example
class MyApp {
    // Some public static void main ... 
}
person Peter    schedule 09.02.2016
comment
Хм, но проблема в том, что у меня есть отдельные классы @Configuration и beans в обоих проектах A и B соответственно. Таким образом, bean-компоненты должны сканироваться обоими сканерами проекта. Проблема в том, что когда я пытаюсь выполнить Autowire bean из проекта B в проекте A, он говорит, что не может найти bean-компонент. В вашем решении, я полагаю, я бы не определял bean-компоненты в проекте B, только в проекте A? - person user1340582; 10.02.2016
comment
Привет, извините за непонятность. У вас есть один проект, запускающий процесс сканирования. В вашем случае Project A. Этот начальный сканер должен знать о деревьях пакетов, которые нужно сканировать. Это приводит его к тому, что он может найти все классы @Configuration в деревьях пакетов. Надеюсь, это немного проясняет ситуацию. - person Peter; 10.02.2016
comment
Спасибо за разъяснения :) Я думал, что задействованы два отдельных сканера, но теперь я понял. Спасибо! - person user1340582; 10.02.2016
comment
В моем случае Проект А не знает о Проекте Б, поэтому как справиться с этой ситуацией. Проект является поставщиком, а проект B - потребителем, поэтому потребителем может быть кто угодно. - person Lakshay Sharma; 30.06.2021