2017-12-04 7 views
1

나는 내 수업 중 봄에 여러 관계를 1 : 1로 가지고 있습니다. 그리고 내가 로그인하려고 할 때, 에러를 얻습니다. 이것은 무한 재귀와 같습니다, 여기에 전체 에러 메시지가 있습니다.com.fasterxml.jackson.databind.ser.BeanSerializer.serialize Spring JPA

at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:112) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.10.jar:2.8.10] 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689) ~[jackson-databind-2.8.10.jar:2.8.10] 

나는 서로 연결된 5 개의 클래스가 있습니다. 여기 그들은 :

@Entity 
public class AppUser implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 

    @Column(unique = true) 
    private String username; 

    private String password; 

    @ElementCollection(fetch = FetchType.EAGER) 
    private List<String> roles = new ArrayList<>(); 

    @ManyToOne 
    @JoinColumn(name = "apartmen_id") 
    @JsonIgnoreProperties(value = {"apartmen_tenats"}, allowSetters=true) 
    private Apartmen apartmen; // apartmen in which he lives 

    @ManyToOne 
    @JoinColumn(name = "institution_id") 
    @JsonIgnoreProperties(value = {"workers"}, allowSetters=true) 
    private Institution institution; // institution in which he works 

    @OneToMany(mappedBy = "worker") 
    @JsonIgnoreProperties(value = {"worker"}, allowSetters = true) 
    private Set<Failure> failures; // Kvarovi na kojima je radio 
} 

번째 클래스 :

@Entity 
public class Failure implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

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

    private String name; 
    private String description; // Opis kvara 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date dateCreated; // Datum i vreme kada je kvar kreiran 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date dateSolved; // Datum i vreme kada je kvar popravljen 

    private boolean solved; // Da li je kvar popravljen 

    @ManyToOne 
    @JoinColumn(name = "app_user_id") 
    @JsonIgnoreProperties(value = {"failures"}, allowSetters=true) 
    private AppUser worker; // Radnik koji je zaduzen za kvar 

    @ManyToOne 
    @JoinColumn(name = "institution_id") 
    @JsonIgnoreProperties(value = {"failures"}, allowSetters=true) 
    private Institution institution; // Institucija kojoj je kvar prijavljen 

    @ManyToOne 
    @JoinColumn(name = "building_id") 
    @JsonIgnoreProperties(value = {"failures"}, allowSetters=true) 
    private Building building; // Zgrada u kojoj je kvar nastao 
} 

번째 클래스 :

@Entity 
public class Building implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

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

    private String name; 
    private String location; 
    private String owner; // Vlasnik zgrade 
    private int numberOfApartments; 
    private int numberOfAparartmentsWithTenats; // Broj stanova koji su naseljeni 
    private boolean hasPresident; // Oznacava da li zgrada ima predsednika skupstine stanara 

    @OneToMany(mappedBy = "apartmenBuilding") 
    @JsonIgnoreProperties(value = {"apartmenBuilding"}, allowSetters = true) 
    private Set<Apartmen> apartments; // stanovi u zgradi 

    @ManyToMany(mappedBy = "buildings") 
    @JsonIgnoreProperties(value = {"buildings"}, allowSetters = true) 
    private Set<Institution> institutions; 

    @OneToMany(mappedBy = "building", fetch = FetchType.EAGER) 
    @JsonIgnoreProperties(value = {"building"}, allowSetters = true) 
    private List<Failure> failures; // Kvarovi koji su nastali u zgradi 
} 

네번째 분류 :

@Entity 
public class Institution { 

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

    private String name; 
    private String location; 
    private String director; 
    private String email; 
    private String contactPhone; 
    private String webSiteUrl; 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
    @JoinTable(name = "institution_building", 
     joinColumns = @JoinColumn(name = "institution_id", referencedColumnName = "id"), 
     inverseJoinColumns = @JoinColumn(name = "building_id", referencedColumnName = "id")) 
    @JsonIgnoreProperties(value = {"institutions"}, allowSetters=true) 
    private Set<Building> buildings; // Buildings which this institution is maintaining 

    @OneToMany(mappedBy = "institution") 
    @JsonIgnoreProperties(value = {"institution"}, allowSetters = true) 
    private Set<AppUser> workers; 

    @OneToMany(mappedBy = "institution", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JsonIgnoreProperties(value = {"institution"}, allowSetters = true) 
    private Set<Failure> failures; // Kvarovi na kojima je radila institucija 
} 

마지막 클래스 인 :

@Entity 
public class Apartmen implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

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

    private String name; 
    private String location; 
    private String owner; 
    private int numberOfTenats; 
    private boolean hasApartmentBuilding; 
    private boolean hasOwner; 

    @ManyToOne 
    @JoinColumn(name = "building_id") 
    @JsonIgnoreProperties(value = {"apartments"}, allowSetters=true) 
    private Building apartmenBuilding; 

    @OneToMany(mappedBy = "apartmen") 
    @JsonIgnoreProperties(value = {"apartmen"}, allowSetters = true) 
    private Set<AppUser> apartmen_tenats; 
} 

왜 그런지는 모르겠지만 실패 클래스와의 관계 때문일 수 있습니다. 그 클래스는 내 코드에서 다른 모든 클래스와 관계가 있기 때문에 그럴 수도 있다고 생각합니다. 그렇다면 왜 그런 일이 일어나고 어떻게 제대로 수행하는지 나와 함께 보여주십시오.

미리 감사드립니다.

+0

기본적으로 JSON 직렬화이며 JPA API는 아닙니다. 전혀 다른 프로세스 – DN1

답변

1

@JsonIgnoreProperties은 클래스 수준의 주석이며 클래스의 정확한 필드 이름이 무시 될 것으로 기대합니다.

가장 좋은 방법은 모든 @JsonIgnoreProperties@JsonIgnoreProperties 모두 같은 사건에 대해 유사한 변경을

@ManyToOne 
@JoinColumn(name = "apartmen_id") 
@JsonIgnore 
private Apartmen apartmen; 

단순히

@JsonIgnore. 

@ManyToOne 
@JoinColumn(name = "apartmen_id") 
@JsonIgnoreProperties(value = {"apartmen_tenats"}, allowSetters=true) 
private Apartmen apartmen; 

변경이로 교체하는 것입니다. 정상적으로 작동합니다.