Вызвано: org.springframework.dao.IncorrectResultSizeDataAccessException: запрос не вернул уникальный результат: 3 - PullRequest
1 голос
/ 21 февраля 2020

Я новичок в Spring Security и я создаю приложение AuthSystems с использованием Spring-Security и Msql использую метод запроса extera в JpaRepository, и что методы не возвращают результат, и показывают IncorrectResultSizeDataAccessException.

вот мой код

UserRepository

package com.ganesh.repository;


import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import com.ganesh.model.User;


public interface UserRepository extends JpaRepository<User, Integer> {

    User findByUsername(String username);

}

CustomUserDetailsService

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepo;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = userRepo.findByUsername(username);


        CustomeUserDetail userdetails = null;

        if(user != null) {

            userdetails = new CustomeUserDetail();

            userdetails.setUser(user);


        }else {
            throw new UsernameNotFoundException("User not fond this username"+ username);
        }
        return userdetails;


    }

}

CustomeUserDetail


@Getter
@Setter
public class CustomeUserDetail implements UserDetails {

    /**
     * 
     */
    private static final long serialVersionUID = -8354447536649796292L;


    @Autowired
    private User user;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        return user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_"+ role)).collect(Collectors.toList());
    }

    @Override
    public String getPassword() {

        return user.getPassword();
    }

    @Override
    public String getUsername() {

        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {

        return true;
    }

    @Override
    public boolean isAccountNonLocked() {

        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {

        return true;
    }

    @Override
    public boolean isEnabled() {

        return true;
    }

}
#properties
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/spring_auth
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.propertirs.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.format_sql=true

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

1 Ответ

1 голос
/ 21 февраля 2020

Кажется, что в вашей БД-таблице несколько пользователей с одним и тем же именем пользователя. Таким образом, User findByUsername(String username); возвращает более одного результата.

Вы можете сделать одну из следующих вещей:

  1. Сделать имя пользователя-столбец в вашей БД уникальным.
  2. Измените метод репозитория на List<User> findByUsername(String username);, чтобы получить всех пользователей с этим именем пользователя.
  3. Измените метод репозитория на User findFirstByUsername(String username);, чтобы получить только одного (случайного) пользователя.
...