Spring Data und Rest Conroller?

lam_tr

Top Contributor
Hallo zusammen,

ich stehe wieder vor einer Herausforderung die gespeicherten Daten per Rest Controller aufzurufen. Das Datenmodell sieht so aus, eine Ausgabe hat folgende Attribute und Referenzen zur Zuordnung und Steuersatz Tabelle.

Java:
@Entity
public class Ausgaben {

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

    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    private LocalDate datum;

    private String material;
    private double kostenBrutto;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "steuersatz_id", nullable = false)
    private Steuersatz steuersatz;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "zordnung_id", nullable = false)
    private Zuordnung zuordnung;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    private LocalDateTime erstellt;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    private LocalDateTime aktualisiert;
   
    // Konstruktor, Getter, Setter

Über den Rest Controller werden die Daten abgerufen und als JSon über /data/ausgaben abgerufen.

Code:
@RestController
@RequestMapping("/data")
public class AusgabeRestController {

    @Autowired AusgabeRepository ausgabeRepository;
   
    @RequestMapping(path = "/ausgaben", produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Ausgabe> list() throws JsonProcessingException {
        return ausgabeRepository.findAll();
    }
}

Das passt soweit auch schon, allerdings werden die Ausgabe-Daten im JSon ohne Zuordnung und Steuersatz in der Form dargestellt

Code:
[{"id":1,"name":"A2022011801","beschreibung":"Produkt A","datum":"2022-01-18","brutto":11.99},...]

Habe ich da etwas übersehen? In den meisten Beispielen sehe ich die Darstellung der Referenzen, nur bei mir nicht. Warum? Muss das explizit konfiguriert werden, e.g. im ObjectMapper?

Viele Grüße
lam
 
Du hast ManyToOne mit FetchType LAZY. Das bedeutet, dass es nicht geladen werden soll. Daher ist es leer und wird nicht automatisch geladen.

  • Du kannst also das FetcgType.LAZY weg nehmen
  • Du kannst mittels Hibernate alles manuell nachträglich laden
  • Du kannst eine eigene Query machen mit Annotation EntityGraph der Du die Parameter mitgibst, die geladen werden sollen.
  • Du kannst auch eine Query Annotation setzen, in der Du die Attribute mit JOIN FETCH zum Laden angibst.

Das wäre so auf Anhieb was mir hier einfallen würde ... schnell zusammen geschrieben - Tippfehler oder Denkfehler bei einzelnen Möglichkeiten können vorgekommen sein, da ich jetzt nichts nachgeschlagen habe.
 
Selbst mit EAGER hatte ich auch schon bereits getestet, liefert der mir die gewünschten Referenzen nicht. Ich denke es ist eher ein Problem der JSON Darstellung. Wenn es eine Ladeproblem ist, dann müsste zumindest das Feld in der JSON als Name und der Wert vermutlich null aufgelistet sein?
 
Wenn dir Transaction auf dem RestController startet, sollte es auch mit Lazy keine Probleme geben, sonst eine Exception beim Serialsieren zu json, weil eben das Nachladen fehlschlägt. Sind deine Getter korrekt?
 

Zurück
Oben