Spring bean не получает инъекцию

У меня есть следующий сценарий, в котором я сталкиваюсь с исключением нулевого указателя, потому что bean-компонент не инициализируется и приводит к сбою на моем сервере, который не загружается. В аннотированном методе PostConstruct есть недавно введенный вызов, который не работает. Тот же вызов выполняется в другом методе, которого нет в PostConstruct, который выполняется правильно и не вызывает никаких проблем.

@Component
@Lazy
@Primary
class Parent{
@Autowired
private DesignContextService designContextService;

@PostConstruct
private void init(){
      designContextService.getMethod();// fails
}

private void someFunction(){
      designContextService.getMethod();// executes successfully
}
}

}

Class DesignContextService{
@Autowired
private ContextService contextService;

public void getMethod(){
   contextService.isContextCreated();
  ...
}
// Below classes present in another jar
class ContextService{
   @Inject
    public ContextAdapter contextAdapter;

   public void isContextCreated(){
   contextAdapter.isEstablished();// contextAdapter is null . Throws exception here

} 

}

}

Трассировка стека ошибок:

at 
Caused by org.springframework.beans.factory.BeanCreationException :  Error creating bean ...

at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)



at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)

person jetty    schedule 25.05.2017    source источник
comment
Определен ли Parent как компонент Spring? Внедрение зависимостей работает только в компонентах Spring, а не в других классах, которые не являются компонентами Spring. Кроме того, это не работает, когда вы создаете экземпляр класса, используя new; вам нужно позволить Spring управлять бобами.   -  person Jesper    schedule 25.05.2017
comment
Да, это . Я исправлю пример кода.   -  person jetty    schedule 25.05.2017
comment
class DesignContextService также должен быть аннотирован с помощью @Service или @Component, чтобы Spring правильно его автоматически подключил. Может быть, это ваша проблема?   -  person mingos    schedule 25.05.2017
comment
Опубликуйте настоящий код, сделайте в нем правильный отступ, опубликуйте трассировку стека исключения и попытайтесь предоставить полный минимальный пример. Я даже не знаю, как можно вызвать метод someFunction, поскольку он приватный. Ваш опубликованный код даже не скомпилируется.   -  person JB Nizet    schedule 25.05.2017
comment
DesignContextService аннотируется с помощью @Component   -  person jetty    schedule 25.05.2017
comment
Вы получаете NullPointerExceptionв своем методе init() или какую-либо другую ошибку из весны?   -  person P.J.Meisch    schedule 25.05.2017


Ответы (1)


Это из-за аннотации @lazy. Как указано в документации:

Поведение по умолчанию для реализаций ApplicationContext заключается в предварительном создании экземпляров всех одноэлементных компонентов при запуске. Предварительное создание экземпляра означает, что ApplicationContext с готовностью создаст и настроит все свои singleton bean-компоненты как часть процесса инициализации. Как правило, это хорошо, потому что это означает, что любые ошибки в конфигурации или в окружающей среде будут обнаружены немедленно (а не через несколько часов или даже дней).

Для справки перейдите по следующей ссылке: Использование аннотаций Spring @Lazy и @PostConstruct

Spring: как инициализировать связанные ленивые бобы после основного создание бина

person KayV    schedule 25.05.2017
comment
Пробовал удалить ленивую аннотацию. Проблема не была решена. :( - person jetty; 25.05.2017