为了账号安全,请及时绑定邮箱和手机立即绑定

未能实例化类 HeroController;构造函数抛出异常

未能实例化类 HeroController;构造函数抛出异常

翻过高山走不出你 2022-11-30 13:22:51
我正在为我的网络应用程序使用 SpringBoot,但遇到以下错误:上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为“heroController”的 bean 在文件 [D:\Projects\Java\mydbexxcercise\target\classes\com\db\controllers 中定义时出错\HeroController.class]: bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.db.controllers.HeroController]: Constructor throw exception; 嵌套异常是 java.lang.NullPointerException。这些是我的课程:DBApp 类(主类):package com.db.app;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.domain.EntityScan;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.data.jpa.repository.config.EnableJpaRepositories;/** DAL - Data Access Layer* BL - Business Layer** */@SpringBootApplication@ComponentScan(basePackages = {"com.db.controllers","com.db.services"})@EnableJpaRepositories(basePackages = "com.db.repositories")@EntityScan(basePackages = "com.db.entities")public class DBApp{    public enum PowerCatagory{SpecialPower,Weapon,Machines}    private static ConfigurableApplicationContext appContext;    public static void main(String[] args)    {        appContext = SpringApplication.run(DBApp.class,args);    }    public static ConfigurableApplicationContext getAppContext()    {        return appContext;    }}英雄库类:@Repositorypublic interface HeroRepository extends JpaRepository<Hero, Integer>{}根据控制台,Spring无法初始化HeroController的原因是以下代码导致的异常:private HeroService heroService = DBApp.getAppContext().getBean(HeroService.class);我不知道为什么会在此处抛出异常,因此非常感谢您的帮助。非常感谢您的宝贵时间
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

  1. 将您的移动DBAppcom.db包。

  2. 删除所有注释,但@SpringBootApplication其他注释是隐含的和自动检测的

  3. 删除getAppContext方法。

这样你的DBApp班级应该看起来像这样。

package com.db;


import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication

public class DBApp {

    public enum PowerCatagory{SpecialPower,Weapon,Machines}


    public static void main(String[] args) {

        SpringApplication.run(DBApp.class,args);


    }

}

现在在你HeroService和HeroController你需要使用依赖注入。最佳实践是使用构造函数注入而不是字段注入。


@Service

public class HeroService {


  private final HeroRepository heroRepository;


  public HeroService(HeroRepository heroRepository) {

     this.heroRepository=heroRepository;

  }

这HeroController


@RestController

public class HeroController {


  private final HeroService heroService;


  public HeroController(HeroService heroService) {

    this.heroService=heroService;

  }


注意:上的@Repository注释HeroRepository可以删除,因为它没有添加任何内容。


接下来你的依赖有点乱,使用专用的 spring-boot-starters 来获得正确的和经过测试的版本。您不需要 Hibernate/JPA 依赖项(它们包含在 中spring-boot-starter-data-jpa),其他人需要较新的版本。


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>


    <groupId>MyDBExcercise</groupId>

    <artifactId>mydbexxcercise</artifactId>

    <version>1.0-SNAPSHOT</version>


    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-parent</artifactId>

        <version>2.1.4.RELEASE</version>

    </parent>


    <dependencies>

        <dependency>

            <groupId>com.aerospike</groupId>

            <artifactId>spring-data-aerospike</artifactId>

            <version>2.0.1.RELEASE</version>

        </dependency>


        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-jpa</artifactId>

        </dependency>


        <dependency>

            <groupId>org.postgresql</groupId>

            <artifactId>postgresql</artifactId>

        </dependency>


    </dependencies>


    <build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>

    </build>


</project>


查看完整回答
反对 回复 2022-11-30
?
慕容森

TA贡献1853条经验 获得超18个赞

以下 2 个更改应该可以解决此问题。无需从 App Context 获取 bean。


@Service

public class HeroService {

    @Autowired

    private HeroRepository heroRepository;

&


@RestController

public class HeroController {

    @Autowired

    private HeroService heroService;

& pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


<modelVersion>4.0.0</modelVersion>

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.1.4.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

</parent>


<groupId>MyDBExcercise</groupId>

<artifactId>mydbexxcercise</artifactId>

<version>0.0.1-SNAPSHOT</version>


<properties>

    <java.version>1.8</java.version>

</properties>


<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter</artifactId>

    </dependency>


    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>


    <dependency>

        <groupId>com.aerospike</groupId>

        <artifactId>spring-data-aerospike</artifactId>

        <version>1.0.2.RELEASE</version>

    </dependency>



    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>


    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jpa</artifactId>

    </dependency>


    <dependency>

        <groupId>org.postgresql</groupId>

        <artifactId>postgresql</artifactId>

    </dependency>


</dependencies>


<build>

    <plugins>

        <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

        </plugin>

    </plugins>

</build>

& application.properties


spring.datasource.url=jdbc:postgresql://localhost:5432/postgres

spring.datasource.username=postgres

spring.datasource.password=*****

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信