Autowired зависимость нулевая

У меня есть проект с весенней загрузкой, который я смог успешно запустить на своем старом Mac под управлением Sierra. Недавно я купил новый Mac с Mojave, и когда я собираю проект spring-boot, я получаю NullpointerException при попытке использовать зависимость @Autowired.

Я убедился, что создаю проект с использованием оболочки gradle (версия 4.8) и что на обеих машинах установлена ​​одна и та же версия java (1.8.0_60). Версия весенней загрузки, определенная в файле build.gradle, — 1.5.5.RELEASE.

Я понимаю, что между классами Foo и MyService существует круговая зависимость, но это никогда не было проблемой. В MyService должен быть введен Foo «до» вызова метода Foo init(), но, похоже, это не тот случай, когда я создаю и запускаю его на новом компьютере. Я предполагаю, что каким-то образом используется другая версия Spring, где правила внедрения зависимостей несколько отличаются.

@Component
public class Foo {

   @Autowired
   private MyService service;

   @PostConstruct
   private void init() {
      service.doSomething();
   }

   public void bar() {}
}

@Component
public class MyService {

   @Autowired
   private Foo foo;

   public void doSomething() {
      foo.bar(); // <- NPE occurs here!
   }

}

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

akuma8 24.04.2019 15:27

Спасибо, @Lazy был решением. Не знаю, почему это работало на старой машине.

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

Ответы 1

Ответ принят как подходящий

Это определенно плохой знак, что у вас циклическая зависимость. Вы должны перепроектировать. Я проверял Сообщение блога, который охватывает эту тему, и в нем говорится следующее о циклических зависимостях:

When you have a circular dependency, it’s likely you have a design problem 
and the responsibilities are not well separated. You should try to redesign 
the components properly so their hierarchy is well designed and there is no 
need for circular dependencies.

If you cannot redesign the components (there can be many possible reasons for 
that: legacy code, code that has already been tested and cannot be modified, 
not enough time or resources for a complete redesign…)...

Если вы все еще хотите оставить все как есть, вы можете проверить раздел 4.4. @PostConstruct о том, как они это делают, и черпать из этого вдохновение :).

Почему на одной машине работает, а на другой нет, для меня загадка.

Спасибо, раздел 4.2 решил эту проблему для меня (и подробно baeldung.com/spring-lazy-annotation). Мне нужно было убедиться, что я использую ленивые аннотации как в Autowired, так и в Component.

migueljuan 24.04.2019 15:39

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