【问题标题】:How do I list roles using ENUM?如何使用 ENUM 列出角色?
【发布时间】:2020-09-25 18:28:41
【问题描述】:

我将为添加用户而发出的 POST 请求示例:Vasya, Petrenko,910382741, vasya@mail.ru, ADMIN 前 4 个属性有效,但我不明白如何为角色创建字段。

我的数据库是否正确构建?我使用Json发送请求添加用户,用户与角色的关系是多对多的。我不明白如何发送角色,我需要用户中的另一个属性?

UserController

private UserRepository userRepository;

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


@PostMapping
public String userPostAdd(@RequestBody User user) {
    List<Authority> rolesList = new ArrayList<>();
    for (Role role : user.getRole()){
        Authority r = role.getName();
        if (r != null){
            rolesList.add(r);
        }
    }

    if (!rolesList.isEmpty()){
        userRepository.save(user);
    }
    return "Add user";
}

实体角色

@ToString
@Entity
@Table(name = "role", schema = "task")
public class Role {

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

@Column(name = "name", nullable = false)
@Enumerated(EnumType.STRING)
private Authority name;

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

getter,setter...

}

用户:

@ToString
@Entity
@Table(name = "user", schema = "task")
public class User {

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

@ManyToMany
@JoinTable(name = "user_role",
        joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private List<Role> role;

@OneToMany(mappedBy = "user")
private Set<Contract> contract;

@Column(name = "surname", nullable = false)
private String surname;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "phone", nullable = false, unique = true)
private Integer phone;

getter,setter...

}

枚举

public enum Authority {
    TENANT ("tenant"),
    LANDLORD ("landlord"),
    ADMIN ("admin");

    private final String name;

    private Authority(String s) {
        name = s;
    }

    public boolean equalsName(String otherName) {
        return name.equals(otherName);
    }

    public String toString() {
        return this.name;
    }
}

【问题讨论】:

  • 你能这样吗? github.com/gtiwari333/spring-boot-web-application-seed/tree/… 请注意,此代码中的角色称为权限。另请注意,这是在一个单独的分支中 single-module-no-keycloak
  • @gtiwari333 一般来说,我已经准备了 ENUM 类,但我不知道如何检查角色。他找不到它的位置。它的代码对我来说相当复杂,因为文件夹和分支太多了
  • 它没那么复杂 :) 你能分享你的代码以便我们研究吗?
  • @gtiwari333 是的:github.com/Blacit/TaskSpring 我什至没有注意到这是您的存储库)我想说我对此感到非常惊讶,我喜欢编写代码。我梦想并努力在未来做同样的事情)
  • 在你的 Role 实体类中使用枚举 @Enumerated(EnumType.STRING) private Roles name;

标签: java spring-boot hibernate


【解决方案1】:

问题是您正在设置roles = null,然后对其进行方法调用。您首先需要通过调用valueOf 来获取角色对象。如果角色不存在,它应该为空。以下应该可以工作。

@PostMapping
public String userPostAdd(@ModelAttribute User user) {
    List<Roles> rolesList = new ArrayList<>();
    for (Role role : user.getRole()){
        Roles r = Roles.valueOf(role.getName().toUpperCase());
        if (r != null){
            rolesList.add(r)
        } 
    }
    
    if (!rolesList.isEmpty()){
       userRepository.save(user);
    } 
    return "Add user";
}

【讨论】:

  • 无法解析“角色”中的方法“toUpperCase”。而不是角色,我有权限,而不是 requestUserDetails,我们应该保存用户,据我所知
  • 我又更新了。此外,您正在使用非常模糊的类和变量名称。为什么要将枚举定义为 Roles 而不是 RoleEnum,并且对于您定义为 Role 的角色列表也是如此。这非常令人困惑,社区很难为您提供帮助
  • 为避免混淆,我现在更改了权限而不是角色。我有 ;在 relosList.add(r) 之后丢失;该程序仍然无法运行,返回错误无法解析“Authority”中的方法“toUpperCase”。 IDEA 建议在 Authority 中创建一个 toUpperCase 方法
  • 那你为什么不更新你的代码呢?我仍然不确定您是否将RolesRole 更改为Authority?另外,您是否在 Role 类中定义了任何 getter?
  • 我的数据库构建是否正确?我使用Json发送请求添加用户,用户与角色的关系是多对多的。我不明白如何发送角色,我需要用户中的另一个属性?代码已更新。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 2020-01-02
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2020-04-01
  • 2017-04-12
相关资源
最近更新 更多