首页 > 解决方案 > Spring Boot JPA多对多杰克逊,序列化每个实体

问题描述

我有两个实体,用户和角色;他们有多对多的关系。

@Entity
@Data
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private UUID id;

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

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

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

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private Collection<Role> roles;
}
@Entity
@Data
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private UUID id;

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

    @ManyToMany(mappedBy = "roles")
    private List<User> users;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "roles_authorities", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id", referencedColumnName = "id"))
    private Collection<Authority> authorities;

}

我想将两个实体序列化为 JSON,这样当我要获取用户时,我可以看到他们的角色,但角色对象本身不应该有用户集合

[
  {
    id: "624a174b-0a9e-49be-9116-2b0b2aee4014",
    username: "admin",
    password: "$2a$12$Neo1AdkqDWa2fTeLsAn7T.t9S4/70zDE7Ab2sCPVJ9wy18qNdESpW",
    email: "admin@gmail.com",
    roles: [
      {
        id: "613bb9f1-1607-4f8d-8cd2-f08217d60829",
        name: "ROLE_USER",
      },
      {
        id: "8ed0f60b-71e5-427f-a485-7bdec5a64768",
        name: "ROLE_ADMIN",
      },
    ],
  },
  {
    id: "1825d4f7-d655-4b7e-aefb-e9e82d316c59",
    username: "string",
    password: "$2a$10$C.lyzjlv/d5CpsZw.5IxUOD08UzhCjOzeOfcsPC.Ua.SHvvej6SV2",
    email: "string@mail.ci",
    roles: [
      {
        id: "613bb9f1-1607-4f8d-8cd2-f08217d60829",
        name: "ROLE_USER",
      },
    ],
  },
];

所以对于角色

[
  {
    id: "613bb9f1-1607-4f8d-8cd2-f08217d60829",
    name: "ROLE_USER",
    users: [
      {
        id: "624a174b-0a9e-49be-9116-2b0b2aee4014",
        username: "admin",
        password: "$2a$12$Neo1AdkqDWa2fTeLsAn7T.t9S4/70zDE7Ab2sCPVJ9wy18qNdESpW",
        email: "admin@gmail.com",
      },
      {
        id: "1825d4f7-d655-4b7e-aefb-e9e82d316c59",
        username: "string",
        password: "$2a$10$C.lyzjlv/d5CpsZw.5IxUOD08UzhCjOzeOfcsPC.Ua.SHvvej6SV2",
        email: "string@mail.ci",
      },
    ],
  },
  {
    id: "8ed0f60b-71e5-427f-a485-7bdec5a64768",
    name: "ROLE_ADMIN",
    users: [
      {
        id: "624a174b-0a9e-49be-9116-2b0b2aee4014",
        username: "admin",
        password: "$2a$12$Neo1AdkqDWa2fTeLsAn7T.t9S4/70zDE7Ab2sCPVJ9wy18qNdESpW",
        email: "admin@gmail.com",
      },
    ],
  },
];

现在我可以通过将@JsonIgnore 添加到用户类中的角色集合或角色类中的用户集合来部分实现这一点

我正在寻找类似条件@JsonIgnore 的东西,这样我就可以在相应的 REST 控制器上添加适当的注释

我怎样才能做到这一点?

标签: javajpajackson

解决方案


@JsonIgnoreProperties您可以使用注释标记所有您不希望它被解析的属性

请在此处查看我的帖子,它应该包含对您的问题的指导,但是它没有GSON使用Jackson


推荐阅读