Необязательный <User>findByUsername (String userName) создайте мне ошибку при создании компонента с именем - PullRequest
0 голосов
/ 31 марта 2020

У меня ошибка при использовании в UserRepository

Optional <User> findByUsername (String userName);

моя ошибка

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDetailsServiceImpl' defined in file [/Users/Piotr/Documents/Repository/xxx/xxx/target/classes/com/xxx/xx/services/UserDetailsServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional com.xxxxx.xxx.repositories.UserRepository.findByUsername(java.lang.String)! Unable to locate Attribute  with the the given name [username] on this ManagedType [com.xxxx.xxxx.models.User]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:228) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.be



@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String userName;
    private String lastName;
    private String password;
    private String role;

    public User() {
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return userName;
    }

    public void setName(String userName) {
        this.userName = userName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

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

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singleton(new SimpleGrantedAuthority(role));
        //ToDo Zmiana kolekcji, użytkownik może miec dwie role albo uzyć dwóch zmiennych z falgami
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return userName;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

UserRepository

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

   Optional<User> findByUsername(String userName);

}

UserDtailsServiceImpl

@ Служба публикации c Класс UserDetailsServiceImpl реализует UserDetailsService {

private UserRepository userRepository;

public UserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}

@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
    // todo throw if not exist
    return userRepository.findByUsername(s).get();
}

}

Ответы [ 3 ]

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

Имя метода, который вы вызываете в репозитории, неверно, имя метода должно быть таким:

Optional <User> findByUserName (String userName);

или

Optional <User> findUserByUserName (String userName);

Таким образом, среда данных Spring мог бы реализовать ваш метод. Взгляните сюда в документации .

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

Имя метода должно быть findByUserName в хранилище, а не findByUsername

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

   Optional<User> findByUserName(String userName);

}
0 голосов
/ 31 марта 2020

Вы должны указать запрос выше в интерфейсе, чтобы он знал, что он ищет. @Query (значение = "ВЫБЕРИТЕ u. * ОТ пользователя u ГДЕ u.username =? 1", nativeQuery = true) Пользователь findByUsername (String username);

...