Spring ,我的类(class)之间有一些一对多的关系。当我尝试登录时出现错误,就像无限递归,这是整个错误消息。
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;
}
我不知道为什么会发生这种情况,但也许是因为与 Failure 类的关系。我认为情况可能是这样,因为该类与我的代码中的所有其他类都有关系。如果是这种情况,请告诉我为什么会发生以及如何正确执行。
提前谢谢您。
最佳答案
@JsonIgnoreProperties
是类级别注释,它期望忽略类中的确切字段名称。
最好的方法是将所有 @JsonIgnoreProperties
替换为简单
@JsonIgnore.
即
@ManyToOne
@JoinColumn(name = "apartmen_id")
@JsonIgnoreProperties(value = {"apartmen_tenats"}, allowSetters=true)
private Apartmen apartmen;
将其更改为
@ManyToOne
@JoinColumn(name = "apartmen_id")
@JsonIgnore
private Apartmen apartmen;
对所有此类出现的 @JsonIgnoreProperties
进行类似的更改。
这应该可行。
关于java - com.fasterxml.jackson.databind.ser.BeanSerializer.serialize Spring JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47640698/