【问题标题】:Parameter 0 of constructor in Class B required a bean of type Class A that could not be foundB 类中构造函数的参数 0 需要 A 类类型的 bean,但无法找到
【发布时间】:2019-05-30 19:53:29
【问题描述】:

我正在 Spring boot rest 中使用 JWT 进行 API 身份验证功能,但遇到以下错误:

说明

构造函数的参数0 com.icfer.huxy.icfer.controller.UserController 需要一个 bean 类型 'com.icfer.huxy.icfer.service.ApplicationUserRepository' 可以 找不到。

动作

考虑定义一个 bean 类型 'com.icfer.huxy.icfer.service.ApplicationUserRepository' 在你的 配置。

以下是我对ApplicationUserRepositoryUserController 类的实现。

ApplicationUserRepository.java

import com.icfer.huxy.icfer.model.ApplicationUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;


public interface ApplicationUserRepository extends JpaRepository<ApplicationUser, Long> {
    ApplicationUser findByUsername(String username);
}

ApplicationUser.java

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class ApplicationUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String username;
    private String password;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

UserController.java

import com.icfer.huxy.icfer.model.ApplicationUser;
import com.icfer.huxy.icfer.service.ApplicationUserRepository;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/users")
public class UserController {

    private ApplicationUserRepository applicationUserRepository;
    private BCryptPasswordEncoder bCryptPasswordEncoder;


    public UserController(ApplicationUserRepository applicationUserRepository,
                          BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.applicationUserRepository = applicationUserRepository;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @PostMapping("/sign-up")
    public void signUp(@RequestBody ApplicationUser user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        applicationUserRepository.save(user);
    }
}

我的 gradle 文件如下:

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-security')
    implementation('org.springframework.boot:spring-boot-starter-web')
    compile("com.auth0:java-jwt:3.4.0")
    runtimeOnly('mysql:mysql-connector-java')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
    testImplementation('org.springframework.security:spring-security-test')
}

以下是我的项目的链接: Github link

【问题讨论】:

  • 与其在文本中转储孤立的代码,不如分享一个我们可以实际运行的示例(在您的 github 存储库中)更有效。那里的源代码缺少控制器所在的包,Spring Boot 应用程序所在的包,组件扫描配置(如果有)。所以,在某种程度上,所有这些细节恐怕都毫无用处。
  • @StephaneNic​​oll,你是对的,但出于隐私的考虑,我现在不能这样做。
  • 也许让我在这种情况下做一个快速的小项目,我分享一个 github 链接。 @StephaneNic​​oll
  • 这是链接@StephaneNic​​oll,github.com/huxaiphaer/icfer

标签: java mysql spring-boot jwt


【解决方案1】:

共享实际示例的另一个原因是有帮助的,因为您共享的代码都没有提供我们需要帮助您的信息。

在您的@SpringBootApplication 上,您有以下内容:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, WebMvcAutoConfiguration.class})
public class IcferApplication { ... }

因为您排除了DataSourceAutoConfiguration,所以不会创建DataSource。没有DataSource,所以 JPA 没有启动。JPA 没有启动,所以你的 JPA 存储库没有创建。

您可以在调试模式下运行您的应用程序(即通过添加-Ddebug 系统属性):

   JpaRepositoriesAutoConfiguration:
      Did not match:
         - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans of type javax.sql.DataSource (OnBeanCondition)
      Matched:
         - @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition)
         - @ConditionalOnProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition)

另外,请不要将EnableAutoConfigurationSpringBootApplication 一起使用,后者也有exclude 属性。

一旦我删除了 DataSourceAutoConfiguration 上的排除项,该错误就消失了。

【讨论】:

猜你喜欢
  • 2021-12-10
  • 2020-08-26
  • 1970-01-01
  • 2023-02-07
  • 2019-10-20
  • 2023-02-05
  • 2019-02-10
  • 2020-02-23
  • 2018-12-06
相关资源
最近更新 更多