【问题标题】:Spring bean with @Autowire in superclass超类中带有@Autowire的Spring bean
【发布时间】:2020-01-07 07:31:54
【问题描述】:

我有一个像下面这样的子类:-

@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 中配置它并使用构造函数注入实例化超类 bean。 有人知道如何解决吗?

【问题讨论】:

  • 请使用envBean bean 的配置更新您的问题。
  • 在两个类中都使用构造函数注入。 envBean.getProperty("effective.date"); 在构造 bean 时调用。并且 Spring 不可能在构建 bean 之前设置 bean 的字段的值。所以当该行执行时,envBean 保证为空。
  • 在构造对象之后,自动装配字段可用。所以在构造函数中访问它们是行不通的。如果需要,可以使用构造函数注入,或者直接使用@Value 获取属性,而不是自己检索。

标签: java spring dependency-injection autowired


【解决方案1】:

也许你可以尝试接口 -> InitializingBean,并覆盖方法'afterPropertiesSet',然后你可以分配 Effective_date 值。就像:

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

【讨论】:

  • 感谢您的帮助。您建议的解决方案已经奏效。
【解决方案2】:

这似乎是因为 Spring 必须首先创建类 Superclass 的实例,然后才注入 EnvironmentBean。也就是说,当类Superclass 被实例化时,Java 将尝试实例化字段DateTime effective_date,甚至在Spring 尝试注入依赖项@Autowired @Qualifier("envBean") private EnvironmentBean envBean; 之前。此时,envBean 指的是null。因此,这肯定会引发 NPE。 (我的观点。)

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

【讨论】:

    【解决方案3】:

    必须有一个名为EnvironmentBean的类,它必须使用文档https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/package-summary.html中显示的任何一种Spring原型进行注释

    组件 - 表明一个带注释的类是一个“组件”。

    Controller - 表示带注释的类是“Controller”

    Indexed - 表明带注释的元素代表索引的原型。

    Repository - 表示带注释的类是“Repository”,最初由 Domain-Driven Design (Evans, 2003) 定义为“一种封装存储、检索和搜索行为的机制,它模拟对象的集合”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2015-09-02
      • 1970-01-01
      相关资源
      最近更新 更多