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

org.springframework.beans.BeanInstantiationException:实例化失败

邢项禹
2023-03-14

我刚刚开始学习Spring Boot。我的代码中有一个错误,上面写着

创建文件[E:\Programming\Java\boot\Project1\target\classes\com\example\demo\alien.class]中定义的名为“alien”的bean时出错:bean实例化失败;嵌套异常是org.springframework.bean。BeanInstationException:未能实例化[com.example.demo.Alien]:构造函数引发异常;嵌套异常是java.lang.NullPointerException:无法调用“com.example.demo.Laptop.compile(),因为“this.laptp”为空

下面是我的代码

主类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Project1Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context= SpringApplication.run(Project1Application.class, args);
        
        Alien a=context.getBean(Alien.class);
        a.show();
    }

}

外星类

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Alien {

    private int id;
    private String name;
    private String tech;
    @Autowired
    private Laptop laptop;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTech() {
        return tech;
    }
    public void setTech(String tech) {
        this.tech = tech;
    }
    
    public void show() {
        System.out.println("in show..........");
    }
    public Alien() {
        super();
        System.out.println("Object Created......");
        laptop.compile();
    }
    
}

笔记本电脑类

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class Laptop {

    private int lid;
    private String brand;
    
    @Override
    public String toString() {
        return "Laptop [lid=" + lid + ", brand=" + brand + "]";
    }
    public int getLid() {
        return lid;
    }
    public void setLid(int lid) {
        this.lid = lid;
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    
    public void compile() {
        System.out.println("Compiling..");
    }
    
}

共有1个答案

邹博裕
2023-03-14

问题是您在< code>Alien的构造函数中调用了< code>laptop.compile()。当时Spring还没有注入< code>Laptop bean,所以< code>this.laptop为< code>null。

有几种方法可以解决这个问题。

首先,您可以移动<code>笔记本电脑。compile()到一个单独的方法,用@PostConstruct。例如:

@Component
public class Alien {
    private int id;
    private String name;
    private String tech;
    @Autowired
    private Laptop laptop;
    
    // Getters + Setters
    
    public void show() {
        System.out.println("in show..........");
    }

    // Add this method
    @PostConstruct
    public void initialize() {
        laptop.compile();
    }

    public Alien() {
        super();
        System.out.println("Object Created......");
    }
}

或者,您可以将现场注入替换为构造函数注入:

@Component
public class Alien {
    private int id;
    private String name;
    private String tech;
    private Laptop laptop; // Remove @Autowired
    
    // Getters + Setters
    
    public void show() {
        System.out.println("in show..........");
    }


    @Autowired // Put @Autowired here
    public Alien(Laptop laptop) {
        super();
        this.laptop = laptop;
        System.out.println("Object Created......");
        this.laptop.compile();
    }
}

如今,构造函数注入是注入beans的首选方式,因此这将是一个可行的解决方案。注意,尽管我在构造函数的顶部添加了< code>@Autowired注释,但是如果这是唯一的构造函数,就没有必要了。

 类似资料:
  • 我正在尝试找到一种简单的方法(使用C 11之前,即没有)来记录模板对类型的哪些要求才能正常工作。也许有更好的方法可以做到这一点。但是,这是我的问题: 为什么是

  • 我正在将一个应用程序从Websphere迁移到jboss EAP 6.0。我已经在Jboss控制台上创建了数据源。但在我的代码中,我是这样引用的: 但是当从Jboss点击应用程序时,它会给出以下错误: 致命的http-/135.155.175.224:8080-1数据库连接。DBAccess-getDatasource():严重错误:JDBC命名服务异常:JBAS011843:实例化Initial

  • 我已经容器化了一个Spring引导应用程序。它包含在一个jar文件中。当我单独调用jar文件时,它正在工作,但是当我通过运行它时,它会产生以下错误: ConfigServletWebServerApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatisfiedPendencyException:创建名为“crawle

  • 我正在尝试使用Python Splinter Selenium PhantomJS进行基本测试,但我无法启动phantomjs浏览器。(Chrome 我得到一个错误: 此外,当我跑步时: 我基本上得到了同样的错误。 看起来PhantomJS正在使用远程驱动程序连接到远程服务器,但splinter没有启动selenium(?)PhantomJS要连接到的服务器。我不介意进入splinter(?)的源

  • 假设你有一个绘制了很多模型的场景,而大部分的模型包含的是同一组顶点数据,只不过进行的是不同的世界空间变换。想象一个充满草的场景:每根草都是一个包含几个三角形的小模型。你可能会需要绘制很多根草,最终在每帧中你可能会需要渲染上千或者上万根草。因为每一根草仅仅是由几个三角形构成,渲染几乎是瞬间完成的,但上千个渲染函数调用却会极大地影响性能。 如果我们需要渲染大量物体时,代码看起来会像这样: for(un

  • 我试图让公共资源日志为log4j配置工作,但是当启动服务器时,我总是得到一个异常。当试图使用StringUtils时,我也会得到一个类似的异常,它可以通过另一个公共资源库获得。 pom依赖项: