首页 > 解决方案 > 类关系问题在 JSON 中不返回某些数据

问题描述

我需要将此 Json 返回到我的项目:

{
  "data": {
    "id": 1,
    "username": "renato",
    "name": "Renato",
    "email": "asdasd@outlook.com",
    "roles": [
      {
        "id": 1,
        "name": "ROLE_USER",
        "accessList": [
          {
            "id_access": 1,
            "id_role": {
              "id_role": 1,
              "name": "ROLE_USER",
              "authority": "ROLE_USER"
            },
            "id_program": {
              "id_program": 1,
              "code_program": "TEST",
              "name": "test"
             },
            "id_view": {
              "id_view": 1,
              "code_view": "TEST",
              "name": "test"
             },
            "menuYesNo": true,
            "accessYesNo": true,
            "saveYesNo": true,
            "editYesNo": true,
            "deleteYesNo": true
          }
        ]
      }
    ]
  }
}

但它返回这个:

{
  "data": {
    "id": 1,
    "username": "renato",
    "name": "Renato",
    "email": "asdasd@outlook.com",
    "roles": [
      {
        "id": 1,
        "name": "ROLE_USER",
        "accessList": [
          {
            "id_access": 1,
            "id_role": {
              "id_role": 1,
              "name": "ROLE_USER",
              "authority": "ROLE_USER"
            },
            "id_program": {},
            "id_view": {},
            "menuYesNo": true,
            "accessYesNo": true,
            "saveYesNo": true,
            "editYesNo": true,
            "deleteYesNo": true
          } 
        ]
      }
    ]
  }
}

只有类 AccessModel 和 RoleModel 有双向关系,ProgramModel 和 ViewModel 与 AccessModel 之间存在单向关系。

OBS:我使用 ModelMapper 将 UserModel 映射到 UserDTO。在 UserDTO 中存在 RoleModel。RoleModel 和 AccessModel 分别有一个 @JsonManagedReference 和 @JsonBackReference,但 ProgramModel 和 ViewModel 没有。

@Data
@Entity
@Table(schema = "`SCH`", name = "`USER`")
public class UserModel implements UserDetails {

    private static final long serialVersionUID = -2195101536379303067L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(table = "USER", name="`ID_USER`", nullable = true)
    private Long id_user;
    @Column(table = "USER", name="`USERNAME`", nullable = true, length = 50)
    private String username;
    @Column(table = "USER", name="`PASSWORD`", nullable = true, length = 255)
    private String password;
    @Column(table = "USER", name="`NAME`", length = 255)
    private String name;
    @Column(table = "USER", name="`EMAIL`", length = 255)
    private String email;
    @Column(table = "USER", name="`DATE_EXPERED`", nullable = true)
    private LocalDate dateExpered;
    @Column(table = "USER", name="`ACCOUNT_ACTIVE`", nullable = true)
    private Boolean accountAtive;
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(schema = "`SCH`", name = "`USER_ROLE`" ,
    joinColumns = @JoinColumn(
        name = "`CD_USER`", referencedColumnName ="`ID_USER`"
    ),
    inverseJoinColumns = @JoinColumn(
        name = "`CD_ROLE`", referencedColumnName = "`ID_ROLE`"
    ))
    @JsonBackReference
    private Collection<RoleModel> roles;

    //METHODS USERDETAILS
}

@Data
@Entity
@Table(schema = "`SCH`", name = "`ROLE`")
public class RoleModel implements GrantedAuthority {

    private static final long serialVersionUID = -1320143054659054908L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(table = "ROLE", name = "`ID_ROLE`", nullable = true)
    private Long id_role;

    @Column(table = "ROLE", name = "`NAME`", nullable = true, length = 255)
    private String name;

    @JsonBackReference
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "id_role", fetch = FetchType.LAZY)
    private List<AccessModel> accessList;

}

@Data
@Entity
@Table(schema = "`SCH`", name = "`ACCESS`")
public class AccessModel implements Serializable {

    private static final long serialVersionUID = -5590889002302223720L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(table = "ACCESS", name = "`ID_ACCESS`", nullable = true)
    private Long id_access;


    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "`CD_ROLE`")
    @JsonManagedReference
    private RoleModel id_role;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "`CD_PROGRAM`")
    private ProgramModel id_program;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "`CD_VIEW`")
    private ViewModel id_view;

    @Column(table = "ACCESS", name = "`MENU_YES_NO`", nullable = true)
    private Boolean menuYesNo;

    @Column(table = "ACCESS", name = "`ACCESS_YES_NO`", nullable = true)
    private Boolean accessYesNo;

    @Column(table = "ACCESS", name = "`SAVE_YES_NO`", nullable = true)
    private Boolean saveYesNo;

    @Column(table = "ACCESS", name = "`EDIT_YES_NO`", nullable = true)
    private Boolean editYesNo;

    @Column(table = "ACCESS", name = "`DELETE_YES_NO`", nullable = true)
    private Boolean deleteYesNo;
}

@Entity
@Table(name = "`PROGRAM`", schema = "`SCH`")
public class ProgramModel implements Serializable {

    private static final long serialVersionUID = -726159076909575803L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(table = "PROGRAM", name = "`ID_PROGRAM`", nullable = true)
    private Long id_program;

    @Column(table = "PROGRAM", name = "`CODE_PROGRAM`", nullable = true)
    private String code_program;

    @Column(table = "PROGRAM", name = "`NAME`", nullable = true)
    private String name;

    @Column(table = "PROGRAM", name = "`ACTIVE`", nullable = true)
    private Boolean active;

}

@Entity
@Table(name = "`VIEW`", schema = "`SCH`")
public class ViewModel implements Serializable {

    private static final long serialVersionUID = 3900486010030569933L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(table = "VIEW", name = "`ID_VIEW`", nullable = true)
    private Long id_view;
    @Column(table = "VIEW", name = "`CODE_VIEW`", nullable = true)
    private String code_view;
    @Column(table = "VIEW", name = "`NAME`", nullable = true)
    private String name;
    @Column(table = "VIEW", name = "`ACTIVE`", nullable = true)
    private Boolean active;

}

标签: javajsonpostgresqlspring-bootrest

解决方案


我忘记放入@DataProgramModel 和 ViewModel。


推荐阅读