2 votes

Spring boot JSON retourne des objets imbriqués infinis

J'ai le suivant dans mon code:

EntityEntreprise

@Entity
@Table(name = "company")
public class Company{
   @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
   @JsonUnwrapped
   private Set users;
}

EntityUtilisateur

@Entity
@Table(name="user")
public class User{
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name="company_id")
    private Company company;
}

ControlleurEntreprise

@GetMapping("/company")
public ResponseEntity getAllCompanies(){
    List allCompanies = companyService.findAll();
    return ResponseEntity.ok(allCompanies);

}

Le problème est lorsque j'appelle /company dans le navigateur, je reçois l'objet users incluant l'objet company. quelque chose comme ceci

[
    {
        "id": 1,
        "name": "entreprise",
        "users": [
            {
                "id": 14,
                "firstName": "Yamen",
                "lastName": "Nassif",
                "company": {
                    "id": 1,
                    "name": "entreprise",
                    "users": [
                        {
                            "id": 14,
                            "firstName": "Yamen",
                            "lastName": "Nassif",
                            "company": {
                                "id": 1,
                                "name": "entreprise",
                                "users": [

...

La même chose se produit lorsque j'obtiens tous les utilisateurs, les entreprises et les utilisateurs se développent également.

Ma base de données semble bien.

et c'est sans fin et bien sûr l'erreur Stackoverflow est dans la console. Comment puis-je réparer cela ?

2voto

htshame Points 2610

Vous avez cette erreur en raison de la récursion infinie.

Company a un lien sur User et User a un lien sur Company.

Vous avez au moins deux options:

par exemple

@GetMapping("/company")
public ResponseEntity getAllCompanies() {
    List allCompanies = companyService.findAll();
    List allCompanyDtoList = convertToCompanyDtoList(allCompanies);
    return ResponseEntity.ok(allCompanyDtoList);
}

Personnellement, je préfère la deuxième option, car retourner des entités n'est PAS une bonne pratique.

0voto

RaynerMDZ Points 1

Vous pouvez utiliser l'annotation @JsonIgnore pour prévenir ce type de comportement. Cela se produit généralement avec un mapping bidirectionnel au sein de vos entités. Cela est causé par une récursion infinie.

@Entity
@Table(name="user")
public class User{
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name="company_id")
    @JsonIgnore
    private Company company;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X