You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Autowired注解依赖注入异常问题求助

Spring Boot依赖注入异常排查与解决

错误信息

org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'myAppHomeController'的Bean时出错:通过字段'myAppUserRepository'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为'com.myapp.repository.MyAppUsersListRepository'的合格Bean:期望至少有1个符合自动装配候选条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}]

根因:
org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为'com.myapp.repository.MyAppUsersListRepository'的合格Bean:期望至少有1个符合自动装配候选条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

相关代码

Repository接口

package com.myapp.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.myapp.model.User;
public interface MyAppUsersListRepository extends JpaRepository<User, Long> {
}

实体类User

package com.myapp.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name="MyAppUsersList")
public class User {
    @Column(name="username")
    private String userNameA;
    
    @Column(name="email")
    private String emailIdA;
    
    @Column(name="password")
    private String passwordA;
    
    public User(String userName,String password,String email)
    {
        this.userNameA=userName;
        this.passwordA=password;
        this.emailIdA=email;
    }

    public String getUserNameA() {
        return userNameA;
    }

    public void setUserNameA(String userName) {
        this.userNameA = userName;
    }
    
    public String getPasswordA() {
        return passwordA;
    }

    public void setPasswordA(String pswd) {
        this.passwordA = pswd;
    }
    
    public String getEmailIdA() {
        return emailIdA;
    }

    public void setEmailIdA(String emailIdA) {
        this.emailIdA = emailIdA;
    }
}

控制器类

@CrossOrigin(origins = "http://localhost:8080   ")
@RestController
public class MyAppHomeController {
    static boolean MethodExecutedOrNot = false;
    
    @Autowired
    MyAppUsersListRepository myAppUserRepository;
    
    @PostMapping(value="/storeRegistrationDataForH2")
    public ResponseEntity<User> storeRegistrationDataForH2(@RequestBody User userObj)
    {
      try
      {
         User user=myAppUserRepository.save(new User(userObj.getUserNameA(),userObj.getPasswordA(),userObj.getEmailIdA()));
         return new ResponseEntity<>(user,HttpStatus.CREATED);
      }
      catch(Exception exception)
      {
          loggerObj.log(Level.FATAL,"error in user registration in h2 database(using log)");
          return new ResponseEntity<>(null,HttpStatus.INTERNAL_SERVER_ERROR);
      }
    }
}

启动类

package com.example.demo;

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

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
    ConfigurableApplicationContext appContext   =SpringApplication.run(DemoApplication.class, args);
    
    String[] beans=appContext.getBeanDefinitionNames();
    for(String obj:beans)
    {
        System.out.println("ApplicationContextObject:"+obj);
    }
    
    }
}

问题分析与解决方案

1. 包扫描范围不匹配

启动类DemoApplication位于com.example.demo包,而Repository接口在com.myapp.repository包下,Spring Boot默认仅扫描启动类所在包及其子包的组件,导致无法识别Repository。

  • 修复方式:在启动类上添加注解指定扫描范围
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan(basePackages = {"com.myapp"})
@EnableJpaRepositories(basePackages = {"com.myapp.repository"})
public class DemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext appContext = SpringApplication.run(DemoApplication.class, args);
        
        String[] beans = appContext.getBeanDefinitionNames();
        for(String obj : beans) {
            System.out.println("ApplicationContextObject:" + obj);
        }
    }
}

2. Repository重复定义且缺少注解

代码中重复定义了MyAppUsersListRepository,且原始Repository未添加@Repository注解(虽Spring Data JPA会自动代理,但显式注解更规范)。

  • 修复方式:删除控制器下方重复的Repository定义,给原始Repository添加@Repository注解
package com.myapp.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.myapp.model.User;

@Repository
public interface MyAppUsersListRepository extends JpaRepository<User, Long> {
}

3. 实体类缺少无参构造函数

JPA要求实体类必须提供无参构造函数,当前User类只有带参构造,导致Spring无法实例化实体。

  • 修复方式:给User类添加无参构造函数
public User() {}

4. 检查依赖完整性

确保项目依赖中包含Spring Data JPA和对应数据库驱动,以H2为例,pom.xml需包含:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

内容的提问来源于stack exchange,提问作者Muralidharan G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:05:05