【问题标题】:An issue with getting user roles in a Spring Rest application在 Spring Rest 应用程序中获取用户角色的问题
【发布时间】:2018-11-06 19:27:49
【问题描述】:

我有一个带有以下内容的 RestController 类:

@RestController
public class UserRestController 
{
@Autowired
UserService userService;

@Autowired
private SecurityService securityService;

@Autowired
private UserValidator userValidator;

// Get a Single User
@GetMapping("/api/users/{id}")
public User getUserById(@PathVariable(value = "id") Long userId) {
    return userService.getUserById(userId);
}

这是 UserService 中的 getUserById 函数:

 public User getUserById(@PathVariable(value = "id") Long userId) {
    return userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User", "id", userId));
}

这是 localhost:8080/api/users/11 上的 GET 请求的结果:

{
"id": 11,
"name": null,
"email": null,
"password": "$2a$10$HykDWcHU3vO9YAcdXiWieua9YyYMkwrNIk7WgpmVzVwENb71fDCsW",
"status": null,
"tel": null,
"confirmation": null,
"birth_date": null,
"createdAt": "2018-05-22T09:09:12.000+0000",
"updatedAt": "2018-05-22T09:09:12.000+0000",
"username": "ouissal@gmail.com"
}

这是 localhost:8080/users/11

上的 GET 请求的结果
{
"name": null,
"email": null,
"password": "$2a$10$HykDWcHU3vO9YAcdXiWieua9YyYMkwrNIk7WgpmVzVwENb71fDCsW",
"status": null,
"tel": null,
"confirmation": null,
"birth_date": null,
"createdAt": "2018-05-22T09:09:12.000+0000",
"updatedAt": "2018-05-22T09:09:12.000+0000",
"username": "ouissal@gmail.com",
"_links": {
    "self": {
        "href": "http://localhost:8080/users/11"
    },
    "user": {
        "href": "http://localhost:8080/users/11"
    },
    "roles": {
        "href": "http://localhost:8080/users/11/roles"
    }
}
}

我的控制器中没有为 /users 映射的任何内容,如何使用我的控制器获取角色?


编辑

这是我的用户类:

@Entity
@Table(name = "user")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, 
    allowGetters = true)

公共类用户实现可序列化{

private static final long serialVersionUID = 1L;


public User() {
    super();
    // TODO Auto-generated constructor stub
}

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

@Column(name = "user_name")
//@NotBlank
private String name;

@Column(name = "user_email")
//@NotBlank
private String email;

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

@Column(name = "user_status")
private String status;

@Column(name = "user_tel")
private String tel;

@Column(name = "user_confirmation")
private String confirmation;

@Column(name = "user_birth_date")
@Temporal(TemporalType.DATE)
private Date birth_date;

@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date createdAt;

@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updatedAt;

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

@Column(name = "username")
@NotBlank
private String username;

public long getId() {
    return id;
}

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

public String getName() {
    return name;
}

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

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

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

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getTel() {
    return tel;
}

public void setTel(String tel) {
    this.tel = tel;
}

public String getConfirmation() {
    return confirmation;
}

public void setConfirmation(String confirmation) {
    this.confirmation = confirmation;
}

public Date getBirth_date() {
    return birth_date;
}

public void setBirth_date(Date birth_date) {
    this.birth_date = birth_date;
}

public Date getCreatedAt() {
    return createdAt;
}

public Date getUpdatedAt() {
    return updatedAt;
}

public void setUpdatedAt(Date updatedAt) {
    this.updatedAt = updatedAt;
}

public Set<Role> getRoles() {
    return roles;
}

public void setRoles(Set<Role> roles) {
    this.roles = roles;
}
}

这是我的角色类:

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

@Id
@Column(name = "role_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "role_name")
private String name;
@ManyToMany(mappedBy = "roles")
@JsonManagedReference
private Set<User> users;



public Role() {
    super();
}

public Long getId() {
    return id;
}

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

public String getName() {
    return name;
}

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


public Set<User> getUsers() {
    return users;
}

public void setUsers(Set<User> users) {
    this.users = users;
}
}

【问题讨论】:

  • 你试过点击roles url http://localhost:8080/users/11/roles 你在那里得到角色吗?
  • 是的,我确实得到了它们,但我不明白为什么我得到它们,尽管我的控制器不是为 /users 而是为 /api/users 映射的。我也不知道应该以什么方式编辑我的控制器以在 /api/users/ 上获取它们
  • 能否提供User类的代码?您直接将其作为响应返回,因此如果您想在 json 响应中看到它们,它还必须包含角色。
  • 你在使用spring-data-rest lib吗?看起来您正在学习本教程:baeldung.com/spring-data-rest-intro
  • 看看这个答案:stackoverflow.com/a/37393711/2929488,我想这可以解释为什么你的角色没有序列化为 json

标签: java spring rest roles


【解决方案1】:

带有JsonBackReference 注释的属性不会包含在您的序列化内容中。 要包含角色,请交换RoleUser 中的JsonBackReferenceJsonManagedReference 注释。

这会将Roles 包含在User 中,但反过来不会。

更多信息可以查看answer

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2015-05-14
    • 1970-01-01
    • 2018-02-28
    • 2013-08-21
    • 1970-01-01
    • 2012-12-24
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多