Весенний боб с @Autowire в суперклассе - PullRequest
0 голосов
/ 07 января 2020

У меня есть подкласс, как показано ниже: -

@Component
public class Subclass extends Superclass {

    //few inherited methods implementation

}

Superclass is like below:-
@Component
public class Superclass implements InterfaceA {
     @Autowired
     @Qualifier("envBean")
     private EnvironmentBean envBean;
     private DateTime effective_date = envBean.getProperty("effective.date");
}

Теперь при развертывании приложения я получаю ошибки ниже

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name "Subclass"

Constructor threw exception; nested exception is java.lang.NullPointerException
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [Subclass]:Constructor threw exception; nested exception is java.lang.NullPointerException.

и, наконец, я увидел -

Caused by: java.lang.NullPointerException: null
at Superclass <init> (SuperClass.java:{lineNumber} 

, который находится в следующей строке: -

**envBean.getProperty("effective.date");**

Я попытался использовать конструктор с внедрением свойства EnvironmentBean из самого подкласса. Попытался настроить его в xml и создать экземпляр компонента Superclass с помощью конструктора. У кого-нибудь есть идеи, как это решить?

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Может быть, вы можете попробовать интерфейс -> InitializingBean и переопределить метод afterPropertiesSet, тогда вы можете присвоить значениеffective_date. просто как:

@Override
public void afterPropertiesSet() {
    effective_date = envBean.getProperty("effective.date");
}
0 голосов
/ 07 января 2020

Похоже, это связано с тем, что Spring сначала должен создать экземпляр класса Superclass, а затем вводить EnvironmentBean. То есть, когда создается экземпляр класса Superclass, Java будет пытаться создать экземпляр поля DateTime effective_date даже до того, как Spring попытается внедрить зависимость @Autowired @Qualifier("envBean") private EnvironmentBean envBean;. В настоящее время envBean относится к null. Следовательно, это, безусловно, бросит NPE. (На мой взгляд.)

Итак, не уверен, действительно ли это связано с самой иерархией классов.

0 голосов
/ 07 января 2020

Должен существовать класс с именем EnvironmentBean Он должен быть аннотирован любым стереотипом Spring, показанным в do c https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/package-summary.html

Компонент - Указывает, что аннотированный класс является «компонентом».

Контроллер - Указывает, что аннотированный класс является «Контроллером»

Indexed - указывает, что аннотированный элемент представляет стереотип для индекса.

Репозиторий - Указывает, что аннотированный класс является «Репозиторием», первоначально определенным Domain-Driven Design (Evans, 2003) как «механизм для инкапсуляции хранения, извлечения и поиска» который эмулирует коллекцию объектов ".

Служба - Указывает, что аннотированный класс - это «Служба», изначально определенная в Управлении доменами (Evans, 2003) как «операция, предлагаемая как интерфейс, который стоит отдельно в модель, без инкапсулированного состояния. "

...