java - com.fasterxml.jackson.databind.ser.BeanSerializer.serialize Spring JPA

标签 java json spring spring-mvc jackson

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/

相关文章:

java - 如何开始使用 java web 服务?

java - Netty服务器关闭异常

java - 从 JSON 对象或 JSON 字符串创建 Jasper Report PDF 表单

java - 将变量从 Servlet 发送到 JSP

javascript - 查找并替换 Json 文件中的项目

java - 我需要为 taglib fmt :formatDate 添加日期翻译

json - 需要从 Grails 3.1.5 应用程序同时提供 GSP 和 JSON

json - pig Json多层存储?

java - Java Spring MVC 中@Scheduled 注解中常量表达式的使用

java - 使用 Java 配置禁用 csrf