Автосвязанная зависимость равна нулю - PullRequest
0 голосов
/ 24 апреля 2019

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

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

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

}

1 Ответ

3 голосов
/ 24 апреля 2019

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

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 того, как они это делают и черпают вдохновение:).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...