Java 超类中带有@Autowire的Springbean

Java 超类中带有@Autowire的Springbean,java,spring,dependency-injection,autowired,Java,Spring,Dependency Injection,Autowired,我有一个子类,如下所示:- @Component public class Subclass extends Superclass { //few inherited methods implementation } Superclass is like below:- @Component public class Superclass implements InterfaceA { @Autowired @Qualifier("envBean")

我有一个子类,如下所示:-

@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} 
我已经尝试从子类本身使用EnvironmentBean属性的构造函数注入 尝试在xml中配置它,并使用构造函数注入实例化超类bean。
有人知道怎么解决吗

必须有一个名为EnvironmentBean的类它必须用文档中显示的任何一个Spring原型进行注释

组件-表示带注释的类是“组件”

控制器-表示带注释的类是“控制器”

索引-表示带注释的元素代表索引的原型

存储库-表示带注释的类是“存储库”,最初由域驱动设计(Evans,2003)定义为“用于封装存储、检索和搜索行为的机制,模拟对象集合”

服务-表示带注释的类是“服务”,最初由域驱动设计(Evans,2003)定义为“作为模型中独立的接口提供的操作,没有封装状态。”


也许您可以尝试接口->初始化Bean,并重写方法“AfterPropertieSet”,然后您可以指定有效的\u日期值。就像:

@Override
public void afterPropertiesSet() {
    effective_date = envBean.getProperty("effective.date");
}

这似乎是因为Spring必须首先创建类
超类的实例,然后注入
环境bean
。也就是说,当类
超类
被实例化时,甚至在Spring尝试注入依赖项
@Autowired@Qualifier(“envBean”)私有环境bean envBean之前,Java将尝试实例化字段
DateTime effective\u date
。此时,
envBean
指的是
null
。因此,这肯定会抛出一个NPE。(我的看法。)


因此,不确定这是否真的与类层次结构本身有关。

请使用
envBean
bean的配置更新您的问题。在这两个类中使用构造函数注入<代码>envBean.getProperty(“生效日期”)。Spring不可能在构建bean之前设置bean字段的值。因此,当执行该行时,envBean保证为null。在构建对象后,自动连接字段可用。所以在构造函数中访问它们是行不通的。如果需要,可以使用构造函数注入,也可以简单地使用
@Value
来获取属性,而不是自己检索属性。谢谢您的帮助。你提出的解决办法奏效了。
@Override
public void afterPropertiesSet() {
    effective_date = envBean.getProperty("effective.date");
}