Spring Boot загружает компонент перед его зависимым компонентом

У меня странное поведение в моем проекте с использованием Spring. У меня есть эта структура:

Main-Spring-Project  
  |_Depends on Library A  
     |_Depends on Library B  

Теперь... в компоненте A есть @Autowired, который внедряет компонент, находящийся в B. Когда у меня открыты все 3 проекта в моей среде разработки и я запускаю основной проект, все работает нормально. Но если я удалю проект A и оставлю B, все вылетает, когда я начинаю говорить:

Field factory in [class in A] required a bean of type '[class in B]' that could not be found.

так что... я подозреваю, что он загружает A, прежде чем B. Чего я не понимаю, так это почему он работает отлично, если у меня открыты оба проекта, и почему он падает, когда у меня закрыт A (основной проект использует свой JAR)

Кстати... если я удалю A и B, все снова будет работать идеально.

После удаления проекта A попробуйте выполнить чистую сборку проекта (основного), а затем развернуть. Это может быть из-за старых ссылок.

ScanQR 30.01.2019 14:08

Убедитесь, что все они находятся под @ComponentScan

Deadpool 30.01.2019 15:27

Они есть... и если бы их не было, это бы не работало и с исходными проектами

Pep Gomez 30.01.2019 15:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
194
1

Ответы 1

Нет Spring не ошибается при загрузке контекста.
Такое поведение имеет смысл: класс просто недоступен во время выполнения.

Здесь вы работаете со снимком/текущим исходным кодом разработки/скомпилированными классами библиотеки B, поскольку библиотека B является частью вашего текущего кода разработки.
Это означает, что зависимости/классы библиотеки B, необходимые во время запуска приложения, зависят не от Maven для их извлечения, а от того, к чему имеет доступ ваша IDE: проекты библиотек A и B.

Чтобы избежать этого, вы должны install (mvn clean install) зависимость B в вашем локальном репозитории Maven/Gradle, но это может быть нецелесообразно, если вам нужно повторять задачу 20 дней в день, потому что исходный код B меняется 20 дней в день.

Обратите внимание, что если вы не использовали свою IDE, вы были бы ограничены в установке зависимости при каждой модификации. Так что, наконец, все не так уж и плохо. Нет ?

Другие вопросы по теме