Неудовлетворенная зависимость выражается через конструктор в SpringBoot - PullRequest
0 голосов
/ 11 марта 2020

Привет, ребята, моя версия Springboot '2.2.4.RELEASE'. Я хочу AutoWire 2 параметра в конструкторе. но это не работает. Мэйби, я думаю, что у PasswordEncoder есть проблема ... Вот код 'UserService. java'.

import kr.co.loosie.foody.domain.User;
import kr.co.loosie.foody.domain.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.Optional;



@Service
@Transactional
public class UserService {

private UserRepository userRepository;
private PasswordEncoder passwordEncoder;


@Autowired
public UserService(UserRepository userRepository,
                   PasswordEncoder passwordEncoder) {
    this.userRepository = userRepository;
    this.passwordEncoder = passwordEncoder;
}

public User registerUser(String email, String name, String password) {
    Optional<User> existed = userRepository.findByEmail(email);
    if (existed.isPresent()) {
        throw new EmailExistedException(email);
    }

    String encodedPassword = passwordEncoder.encode(password);

    User user = User.builder()
            .email(email)
            .name(name)
            .password(encodedPassword)
            .level(1L)
            .build();
    return userRepository.save(user);
}



public User authenticate(String email, String password) {
    User user = userRepository.findByEmail(email)
            .orElseThrow(() -> new EmailNotExistedException(email));

    if (!passwordEncoder.matches(password, user.getPassword())) {
        throw new PasswordWrongException();
    }

    return user;
  }
 }

здесь часть ошибки. @Autowired publi c UserService (UserRepository userRepository, PasswordEncoder passwordEncoder) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; }

это работало, когда я использовал только UserReposiotory для автоматического подключения но я поставил строку PasswordEncoder passwordEncoder , она не работает. Пожалуйста, помогите мне!

Это предупреждающее сообщение

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with         
name 'userService' defined in file [D:\CCC\intellij_ex\foody\foody-customer- 
api\build\classes\java\main\kr\co\loosie\foody\application\UserService.class]: Unsatisfied dependency 
expressed through constructor parameter 1; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 
'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean 
which qualifies as autowire candidate. Dependency annotations: {}

Пожалуйста, помогите мне!

1 Ответ

1 голос
/ 11 марта 2020

Сообщение об ошибке показывает, что для org.springframework.security.crypto.password.PasswordEncoder нет компонента, что означает, что вы его нигде не определили.

Вам потребуется что-то вроде:

@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

В вашей конфигурации ( если конфигурация через Java)

...