【问题标题】:Stack overflow in spring boot authenticationSpring Boot身份验证中的堆栈溢出
【发布时间】:2017-08-02 12:19:02
【问题描述】:

我正在尝试使用 Spring Boot 中的角色创建一个简单的登录。

我有一个用户类:

package com.codecool.domain;


import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name="users")
@Slf4j
public class User {

@Id
@Column(name="user_id", unique = true)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@Column(name="email")
private String email;

@Column(name="password")
private String password;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="user_role", joinColumns =         @JoinColumn(name="user_id"), inverseJoinColumns = @JoinColumn(name="role_id"))
private Set<Role> roles;

private User(){}

public User(String email, String password, Set<Role> roles) {
    this.email = email;
    this.password = password;
    this.roles = roles;
}

}

...和一个角色类:

package com.codecool.domain;


import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name="role")
@Slf4j
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "roles", fetch=FetchType.EAGER)
    private Set<User> users;

    private Role(){}

    public Role(String name){
        this.name = name;
    }
}

每当我尝试通过 login.html 登录时,我都会进入无限循环并显示以下错误消息:

2017-03-12 13:26:17.872 INFO 8794 --- [io-8080-exec-10] o.h.h.i.QueryTranslatorFactoryInitiator:HHH000397:使用 ASTQueryTranslatorFactory Hibernate:从用户 user0_ 中选择 user0_.user_id 作为 user_id1_2_,user0_.email 作为 email2_2_,user0_.password 作为 password3_2_,其中 user0_.email=? Hibernate:选择roles0_.user_id 作为user_id1_1_0_,role0_.role_id 作为role_id2_1_0_,role1_.id 作为id1_0_1_,role1_.name 作为name2_0_1_ 从user_role 角色0_ 内部加入角色role1_ onroles0_.role_id=role1_.id whereroles0_.user_id=? Hibernate:选择 users0_.role_id 作为 role_id2_1_0_,users0_.user_id 作为 user_id1_1_0_,user1_.user_id 作为 user_id1_2_1_,user1_.email 作为 email2_2_1_,user1_.password 作为 password3_2_1_ 从 user_role users0_ 内部加入用户 user1_ on users0_.user_id=user1_.user_id where users0_。角色 ID=? Hibernate:选择roles0_.user_id 作为user_id1_1_0_,role0_.role_id 作为role_id2_1_0_,role1_.id 作为id1_0_1_,role1_.name 作为name2_0_1_ 从user_role 角色0_ 内部加入角色role1_ onroles0_.role_id=role1_.id whereroles0_.user_id=? Hibernate:选择 users0_.role_id 作为 role_id2_1_0_,users0_.user_id 作为 user_id1_1_0_,user1_.user_id 作为 user_id1_2_1_,user1_.email 作为 email2_2_1_,user1_.password 作为 password3_2_1_ 从 user_role users0_ 内部加入用户 user1_ on users0_.user_id=user1_.user_id where users0_。角色 ID=? Hibernate:选择roles0_.user_id 作为user_id1_1_0_,role0_.role_id 作为role_id2_1_0_,role1_.id 作为id1_0_1_,role1_.name 作为name2_0_1_ 从user_role 角色0_ 内部加入角色role1_ onroles0_.role_id=role1_.id whereroles0_.user_id=? Hibernate:选择 users0_.role_id 作为 role_id2_1_0_,users0_.user_id 作为 user_id1_1_0_,user1_.user_id 作为 user_id1_2_1_,user1_.email 作为 email2_2_1_,user1_.password 作为 password3_2_1_ 从 user_role users0_ 内部加入用户 user1_ on users0_.user_id=user1_.user_id where users0_。角色 ID=? Hibernate:选择roles0_.user_id 作为user_id1_1_0_,role0_.role_id 作为role_id2_1_0_,role1_.id 作为id1_0_1_,role1_.name 作为name2_0_1_ 从user_role 角色0_ 内部加入角色role1_ onroles0_.role_id=role1_.id whereroles0_.user_id=? Hibernate:选择 users0_.role_id 作为 role_id2_1_0_,users0_.user_id 作为 user_id1_1_0_,user1_.user_id 作为 user_id1_2_1_,user1_.email 作为 email2_2_1_,user1_.password 作为 password3_2_1_ 从 user_role users0_ 内部加入用户 user1_ on users0_.user_id=user1_.user_id where users0_。 role_id=?

任何想法我错过了什么?

【问题讨论】:

    标签: spring hibernate spring-boot spring-security


    【解决方案1】:

    当你想在 RestController 中返回对象时,对象序列化为 json .Spring 使用 jackson 序列化。为了解决这个问题,你想要 jsonignore 用户或角色,例如忽略 Role.java 中的用户

    @Data
    @Entity
    @Table(name="role")
    @Slf4j
    public class Role {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
    
        private String name;
    
        @ManyToMany(mappedBy = "roles", fetch=FetchType.EAGER)
        @JsonIgnore
        private Set<User> users;
    
        private Role(){}
    
        public Role(String name){
            this.name = name;
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用延迟加载

      @ManyToMany(mappedBy = "roles", fetch=FetchType.LAZY)
      private Set<User> users;
      

      Role 中包含users 并不是一个好主意。最好删除此字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 2018-02-27
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 2019-02-13
        相关资源
        最近更新 更多