簡體   English   中英

Spring 引導 JSON 序列化與父表

[英]Spring Boot JSON serialization with parent table

早上好,我正在嘗試從 spring 引導接收 ajax 調用 JSON 與一系列包含子表和父親的字段。

我已經遇到了無限遞歸等問題,並用@JsonManagedReference 和@JsonBackReference 修復了它。 現在發生了什么? 我至少需要獲取父表中的數據以獲取一個值,但是當我們在 Ajax 中得到答案時,它不會出現。

我怎樣才能在不陷入無限遞歸的情況下獲取該數據?

這些將是表格,我刪除了字段,使其不會很長。

@Entity
@Table(name="actividad_servicio")
public class Actividad_Servicio implements Serializable {

    @JsonBackReference
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_actividad_servicio_tipo_actividad_servicio_id"), name="tipo_actividad_servicio_id", nullable = false, columnDefinition = "int")
    private Tipo_Actividad_Servicio tipo_actividad_servicio;
    
    @JsonBackReference
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_actividad_servicio_empleado_id"), name="empleado_id",columnDefinition = "int")
    private Empleado empleado;

    @JsonManagedReference
    @OneToMany(mappedBy = "actividad_servicio", cascade=CascadeType.ALL, orphanRemoval = true)
    private Set<Actividad_Servicio_Alumno> actividad_servicio_alumno = new HashSet<Actividad_Servicio_Alumno>();
    
    @JsonManagedReference
    @OneToOne(mappedBy = "actividad_servicio", cascade=CascadeType.ALL, orphanRemoval = true)
    private Horario_Actividad_Servicio horario_actividad_servicio = new Horario_Actividad_Servicio();

    @JsonManagedReference
    @OneToMany(mappedBy = "actividad_servicio", cascade=CascadeType.ALL, orphanRemoval = true)
    private Set<Factura> factura = new HashSet<Factura>();

}

@Entity
@Table(name="horario_actividad_servicio")
public class Horario_Actividad_Servicio implements Serializable {

    @JsonBackReference
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_horario_actividad_servicio_actividad_servicio_id"), name="actividad_servicio_id", referencedColumnName = "id", columnDefinition = "int")
    private Actividad_Servicio actividad_servicio;

}

@Entity
@Table(name="tipo_actividad_servicio")
public class Tipo_Actividad_Servicio implements Serializable {

    @JsonManagedReference
    @OneToMany(mappedBy = "tipo_actividad_servicio", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Actividad_Servicio> actividad_servicio = new HashSet<Actividad_Servicio>();

}

在將響應返回給 Ajax 之前,我查看了 service_activity object 的內容,它顯示了 service_activity_type 及其屬性。

@RestController
@RequestMapping("/actividades/rest")
public class ActividadRestController {

    @Autowired
    private Actividad_ServicioService actividad_servicioService;

    @GetMapping
    public Response findOne(@RequestParam int id, Model model) {

        Response response = new Response();

        try {
            Actividad_Servicio actividad_servicio = actividad_servicioService.findById(id);

            response = new Response("Done", actividad_servicio);

        } catch (Exception e) {

            response = new Response("Error", Constants.Error);
            e.printStackTrace();

        }

        return response;

    }

}

但是當它回到 Ajax 時,我檢查了我得到的內容是這樣的:

Success:  - {…}
​            - data: {…}
​​              +  actividad_servicio_alumno: Array []
​​              +  factura: Array []
​​              +  horario_actividad_servicio: Object { id: 10, l: null, hora_inicio_l: "", …}
​​                 <prototype>: Object { … }
​              status: "Done"
​              <prototype>: Object { … }

但是 service_activity_type 並沒有出現以獲取某個字段的值。 我知道這與無限遞歸的問題相沖突,但我想有些事情發生在我身上,我留下了一個注釋,以便我可以獲得那些父值。

非常感謝您的幫助。

首先,不要直接使用實體 class 作為響應,當你想部分忽略時會產生很多問題。

為響應創建 DTO class 以僅序列化您要發送的那些字段。 Map 實體數據響應使用任何 model 映射工具,如 Modelmapper 或 MapStruct。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM