用户的findall()角色存储库的StackOverflowError问题。填充data.sql

时间:2019-06-21 12:23:42

标签: spring-boot jpa spring-security

数据是从h2数据库的data.sql脚本加载的。然后,我想让所有用户都拥有userRepository。我执行roleRepository.findAll(),但出现堆栈溢出错误。 我正在尝试注册并登录。但是,当我提交注册表格时,出现stackoverflow错误。我认为错误是在userRepository.findall()级别上,当数据库中有用户时,它会返回null。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RoleRepository roleRepository;
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public User save(User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        ArrayList<Role> roles = new ArrayList<Role>();
        roleRepository.findAll().forEach(role -> roles.add(role));
        user.setRoles(roles);
        return roleRepository.save(user);
    }
}
  

java.lang.StackOverflowError:空

2 个答案:

答案 0 :(得分:0)

@Override
  public User save(User user) {
  user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
  ArrayList<Role> roles = new ArrayList<Role>();
  roleRepository.findAll().forEach(role -> roles.add(role));

//可能是这里的错误,因为角色包含角色列表,并且您正在为一个用户设置角色。遍历角色或提取角色进行设置!

user.setRoles(roles);
return roleRepository.save(user);
}

答案 1 :(得分:0)

您在$associative_array = json_decode($json, true); $indexed_array = array_values($associative_array); User类之间有一个@OneToMany或@ManyToMany关系

因此,当您调用Role时,它会返回一个角色列表,每个角色都有一个或多个用户,每个用户都有很多角色,依此类推,这会导致无限循环。

因此要解决此问题:您添加了另一个名为 dto 的层,这是一种避免堆栈溢出错误的设计模式。