Java Srping嵌套异常是java.lang.StackOverflowError

时间:2020-03-08 16:19:35

标签: java spring spring-boot

我有一些实体类,尝试从db获取所有数据,但是出现了嵌套异常问题。请在下面查看详细信息: 工人实体:

   Worker{
        @Id
        private Long id;

        @Transient
        private List<WorkerDepartment> workerDepartments;

        @Transient
        private List<WorkerDepartmentPosition> workerDepartmentPositions;

        @Transient
        private List<WorkerAdjustmentBonus> workerAdjustmentBonus;
    }

WorkerDepartment实体

    WorkerDepartment{
        @Id
        private Long id;

        @ManyToOne
        @JsonBackReference(value = "worker")
        @JoinColumn(name = "worker_id")
        private worker worker;

    }

WorkerDepartmentPosition实体

    WorkerDepartmentPosition{
        @Id
        private Long id;

        @Column(name = "worker_id")
        private Long workerId;
    }

WorkerBonus

    WorkerBonus{
        @Id
        private Long id;

        @ManyToOne
        @JsonBackReference(value = "worker")
        @JoinColumn(name = "worker_id")
        private worker worker;

        @ManyToOne
        @JoinColumn(name = "payment_id")
        private WorkerPayment employeePayment;

        @Column(name = "bonus")
        private Double bonus;
    }

我尝试获取所有工作人员,并且响应数据为

{"status":"SUCCESS","data":[have full data],"message":"successfully done"}{"status":"ERROR","message":"Handler dispatch failed; nested exception is java.lang.StackOverflowError"}

请告诉我。

1 个答案:

答案 0 :(得分:0)

问题可能来自于WorkerWorkerDepartment。当Jackson尝试反序列化您的对象时,它会遍历对象图,并且一旦访问了WorkerDepartment属性,它就会返回到Worker并反复执行此循环-过度。

在您已经使用@JsonBackReference(value = "worker")时,您几乎已经解决了该问题,但是在另一端则需要@JsonManagedReference

public class Worker{
    @Id
    private Long id;

    @JsonManagedReference
    private List<WorkerDepartment> workerDepartments;

    @JsonManagedReference
    private List<WorkerDepartmentPosition> workerDepartmentPositions;

    @JsonManagedReference
    private List<WorkerAdjustmentBonus> workerAdjustmentBonus;
}

Baeldung还为此提供了a good tutorial,以供进一步阅读。