在springboot中,我无法在REST控制器上获取具有属性的manytomany的JSON

问题描述 投票:0回答:2

我有一个SpringBoot REST API,其中一个或多个用户是一个或多个团队(设备)的一部分,但每个团队都有一个角色。

当我请求UserRepository.findAll()时,我希望获得所有用户以及他们的团队和角色。但是,当我请求TeamRepository.findAll()时,我想让我的所有团队及其用户和角色。

但是我不知道如何获得双向请求。我尝试使用@jsonmanagedreference和@jsonbackreference,但它只允许我从用户那里获得团队,而并非相反。

目前有

[
{  
        "id": 1,  
        "prenom": "TestPrenom1",  
        "nom": "TestNom1",  
        "roleUserEquipe": []  
}
{  
        "id": 2,  
        "prenom": "TestPrenom2",  
        "nom": "TestNom2",  
        "roleUserEquipe": []  
}
]

但是我想要的是

[
{  
        "id": 1,  
        "prenom": "TestPrenom1",  
        "nom": "TestNom1",  
        "roleUserEquipe": [  
                {
                        "role": "Role1",
                        "team": {
                        "id": 1,  
                                "nom": "Team1"
                        }
                }
        ]  
}
{  
        "id": 2,  
        "prenom": "TestPrenom2",  
        "nom": "TestNom2",  
        "roleUserEquipe": [  
                {
                        "role": "Role2",
                        "team": {
                                "nom": "Team1"
                        }
                }
        ]  
}
]

当我要求我的团队时,我有

[
    {
        "id": 1,
        "nom": "Team1",
        "roleUserEquipe": [
            {}
        ]
    },
    {
        "id": 2,
        "nom": "Team2",
        "roleUserEquipe": [
            {}
        ]
    }
]

但是我想

[
    {
        "id": 1,
        "nom": "Team1",
        "roleUserEquipe": [
                {
                        "role": "Role1",
                        "user": {
                                "id": 1,  
                                "prenom": "TestPrenom1",  
                                "nom": "TestNom1",  
                        }
                },
                {
                        "role": "Role2",
                        "user": {
                                "id": 2,  
                                "prenom": "TestPrenom2",  
                                "nom": "TestNom2",  
                        }
                }
        ]
    },
    {
        "id": 2,
        "nom": "Team2",
        "roleUserEquipe": []
    }
]

我的User.java


@Entity
@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String prenom;
    private String nom;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<RoleUserEquipe> roleUserEquipe = new HashSet<>();

//GETTERS AND SETTERS AND CONSTRUCTORS

}

[我的Equipe.java(团队)


@Entity
@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Equipe implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String nom;

    @OneToMany(mappedBy = "equipe", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<RoleUserEquipe> roleUserEquipe = new HashSet<>();

//GETTERS AND SETTERS AND CONSTRUCTORS

}

我的RoleUserEquipe.java

@Entity
public class RoleUserEquipe implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "equipe_id")
    private Equipe equipe;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    private User user;

    private String role;

//GETTERS AND SETTERS AND CONSTRUCTORS

}

编辑:调试时,子对象可以:它们包含我需要的值。仅当返回JSON响应时,它们才会丢失其值

java spring spring-boot rest jackson
2个回答
0
投票

我不确定这是否行得通,但是请尝试删除以下位置的新关键字:

 @OneToMany(mappedBy = "equipe", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
 private Set<RoleUserEquipe> roleUserEquipe = new HashSet<>();

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<RoleUserEquipe> roleUserEquipe = new HashSet<>();

  @OneToMany(mappedBy = "equipe", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  private Set<RoleUserEquipe> roleUserEquipe;

  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  private Set<RoleUserEquipe> roleUserEquipe;

0
投票

您没有向我们展示如何将域对象转换为资源/ DTO对象。

您是否正在使用Spring ConversionService框架?如果是这样,请向我们显示您编写的转换器。也许您的转换器没有考虑到角色?

© www.soinside.com 2019 - 2024. All rights reserved.