Для параметра 0 конструктора в классе B требуется компонент типа A, который не может быть найден - PullRequest
0 голосов
/ 04 января 2019

Я использую функцию аутентификации API с JWT в Пружинный загрузочный остаток , но сталкиваюсь со следующей ошибкой:

Описание :

Параметру 0 конструктора в com.icfer.huxy.icfer.controller.UserController требуется компонент типа 'com.icfer.huxy.icfer.service.ApplicationUserRepository', который не может быть найден.

Действие :

Попробуйте определить в своей конфигурации bean-компонент типа 'com.icfer.huxy.icfer.service.ApplicationUserRepository.

Ниже я реализовал классы ApplicationUserRepository и UserController.

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 ссылка

1 Ответ

0 голосов
/ 04 января 2019

Еще одна причина, по которой вы можете поделиться реальным образцом, полезна, поскольку ни один из предоставленных вами кодов не предоставляет информацию, которая нам нужна, чтобы помочь вам.

На вашем @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)

Также, пожалуйста, не используйте EnableAutoConfiguration вместе с SpringBootApplication, в последнем также есть атрибут exclude.

Как только я удалил исключение на DataSourceAutoConfiguration, эта ошибка исчезла.

...