当前位置: 首页 > 知识库问答 >
问题:

自动生成的Spring Bean在抽象父类中为空

逄学潞
2023-03-14

我有一个Bean,负责从配置文件加载项目设置,并使它们可用于任何其他可能需要它们的对象:

@Component
public class ProjectSettings extends Settings{[...]}

现在,我有一组组件类,它们通过多个步骤扩展了一个抽象类,我想在其中使用这个bean:

@Component
public class SomeDataDbEditor extends MongoDbEditor<SomeData> {[...]}

public abstract class MongoDbEditor<T extends MongodbEntryInterface> extends MongoDbTypedAccessor<T>{[...]}

public abstract class MongoDbTypedAccessor<T extends MongodbEntryInterface> extends MongoDbAccessor {[...]}

public abstract class MongoDbAccessor {
    @Autowired
    protected ProjectSettings projectSettings;

    public MongoDbAccessor() throws DatabaseNotConnectedException {
        String databaseName = projectSettings.getMongodbDatabaseName();
        [...]
}

根据我的理解,这应该是有效的,因为@autowmed字段受到保护,因此可以从@Component类某些DataDbEditor中看到。然而,相反,我得到了这个例外:

java.lang.IllegalStateException: Failed to load ApplicationContext
[...]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.company.project.module.some_data.database.accessor.SomeDataDbEditor]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:217)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:310)
    ... 124 more
Caused by: java.lang.NullPointerException
    at io.company.project.module.database.accessor.MongoDbAccessor.<init>(MongoDbAccessor.java:26)
    at io.company.project.module.database.accessor.MongoDbTypedAccessor.<init>(MongoDbTypedAccessor.java:20)
    at io.company.project.module.database.accessor.MongoDbEditor.<init>(MongoDbEditor.java:19)
    at io.company.project.module.some_data.database.accessor.SomeDataDbEditor.<init>(SomeDataDbEditor.java:17)

...其中引用的MongoDbAccessor。

现在,我已经确认,在这种情况下,project ectSet字段确实为空。但是,我也能够确认,如果我尝试访问ProjectSettsbean中的ProjectSetbean,工作,和bean得到正确的实例化。

我知道在这一点上,一个可能的解决方案是使用它,然后手动将ProjectSetbean传递给父类,但是这将首先挫败使用依赖注入的观点。此外,我必须为此调整很多课程,如果可能的话,我想避免这种情况。

那么,有人知道为什么会发生这种情况吗?我能做些什么来对付它?


共有1个答案

裴令秋
2023-03-14

如果使用字段注入(字段上的自动连线),则不能在构造函数中使用这些字段,因为Spring只能在构建对象之后,即在所有构造函数完成之后,注入依赖项。

为了避免这种情况,您必须更改为构造函数注入,或者在构造函数中使用单独的方法(用PostConstruct注释)执行初始化工作:

@javax.annotation.PostConstruct
public void initialize() {

}

但是,如果您能够将代码更改为构造函数注入,我(以及Spring世界中的许多其他人)强烈推荐它,因为它确实可以防止此类问题。

 类似资料:
  • 问题是: 我有一个叫做Schema的基类,它是抽象的,它是一个未生成的类。我有两个从Schema继承生成的JAXB类:FixedWidthSchema和DelimitedSchema。 我使用外部绑定(xjb)文件来指定XSD和Java类之间的映射。 在基类模式中,我定义了几个方法: 公共架构静态创建(Model m),它从提供的模型创建架构。 公共抽象Writer marshal(),它将当前架

  • 这里是Java新手。我有两个类(让我们称它们为A和B)和一些方法(例如...))它们包含的代码非常相似,因为它们实际上共享相同的代码。我决定让我的代码更有效,并使用某种父抽象类C,类A、B将继承它。 这是我的问题。方法 doSomething 在类 A 中具有以下签名: < code>doSomething(VievForA视图,...) 而B类中的相同方法do的签名如下: < code>doSo

  • 问题内容: Spring无法自动连线对象?是否可以在抽象类中自动装配对象。假设所有模式都在application-context.xml中提供 问题:@Service @Component应该在基类和扩展类(如果有)上使用什么批注? 例 Extending class application-context.xml 问题答案: 具有自动接线字段的抽象类 以及几个带有@Component注释定义的子

  • 是否有任何JAXB绑定可以告诉JAXB代码生成器将Java类生成为,而不必在XSD中将相应的XML类型标记为? 情况如下: > 我在xsd中定义架构: 我使用内联JAXB绑定(“inline”==“直接在模式中”)来指示应该生成JAXB类的包(): 我使用内联JAXB绑定为我的每个复杂类型(在本例中、和)指示实现类的名称: 我从模式生成JAXB类。这导致: 我自己编写类: 使用这两个类层次结构这样

  • 我想在我即将完成的一些工作中使用builder模式,它在一个层次结构中有几个类。基类将至少有9个字段要启动,各个子类可能会添加2-4个字段。这会很快失控,而builder模式正是出于这个原因吸引了我。我在书籍和文章中初步接触了builder模式。他们是有帮助的,但没有关于如何扩展这种模式。我试图自己实现这一点,但是我在每个子类的构造函数中遇到了麻烦,因为我不知道如何将构建器中收集的数据传递给超级类

  • 错误CS0234:类型或命名空间名称com.sushi.hangover”中不存在。是否缺少程序集引用? 我有一个Android绑定项目,它有从多个接口继承的类,但这些接口没有生成,因此依赖于它们的所有公共类都无法绑定。 如您所见,该接口的没有设置为,因此不会生成C#代码,但是begin生成了依赖于该接口的公共类: 绑定在将接口名称从转换为时,可以识别接口。 是否有任何方法可以强制创建这些接口,而