代码之家  ›  专栏  ›  技术社区  ›  Lutaaya Huzaifah Idris

类B中构造函数的参数0需要找不到类A类型的bean

  •  0
  • Lutaaya Huzaifah Idris  · 技术社区  · 6 年前

    正在使用jwt生成API身份验证功能 弹簧靴座 ,但我面临以下错误:

    描述 :

    中构造函数的参数0 com.icfer.huxy.icfer.controller.usercontroller需要类型为bean的 “com.icfer.huxy.icfer.service.applicationUserRepository”可以 找不到。

    行动 :

    考虑定义一个bean类型 您的中的“com.icfer.huxy.icfer.service.applicationUserRepository” 配置。

    以下是我所实施的 ApplicationUserRepository UserController 类。

    应用程序用户存储库.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);
    }
    

    应用程序用户.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;
        }
    }
    

    用户控制器.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文件de如下:

    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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stephane Nicoll    6 年前

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

    对你 @SpringBootApplication 您有以下内容:

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

    因为你排除了 DataSourceAutoConfiguration 没有 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)
    

    另外,请不要使用 EnableAutoConfiguration 一起 SpringBootApplication 有一个 exclude 也属于后者。

    一旦我移除了上的排除项 数据源自动配置 那个错误消失了。