JsonMappingException: Proxy konnte nicht initialisiert werden - keine Sitzung

7

Ich erstelle einen RESTful Web Service, der JSON konsumiert und zurückgibt. Ich stoße auf die folgende Stack-Ablaufverfolgung, wenn ich versuche, ein ESRBReading-Objekt über die Service-Schicht von der Datenbank abzurufen. Wenn ich jedoch das Spring Data JPA-Repository direkt in den Controller einfüge und es zum Abrufen des ESRBReating nach ID verwendet, funktioniert es einwandfrei. Beim Aufruf über die Service-Schicht funktioniert es jedoch nicht. Ich habe den Stack-Trace und den Code unten zur Verfügung gestellt. Kann mir jemand erklären, warum dies beim Durchlaufen einer Service-Schicht passiert, aber nicht beim direkten Durchgehen des Spring Data JPA-Repositorys? Wie behebe ich dieses Problem?

Stapelverfolgung

%Vor%

Controller

%Vor%

Service

%Vor%

Repository

%Vor%

Modell

%Vor%

Dieser Controller-Code funktioniert einwandfrei und geht direkt durch das Repository.

%Vor%

}

UPDATE:

Ich folgte Randall Harleighs Ratschlag und setzte die umgekehrte Sammlung mit @JsonIgnore. Aber jetzt bekomme ich eine völlig andere Stack-Spur. Es scheint nun, Jackson / Spring weiß nicht, wie man ESBRBRating serialisiert. Irgendwelche Tipps zu diesem Thema?

%Vor%

Update 2:

Ich habe @Proxy (lazy = false) in die Klasse ESRBReating gestellt und jetzt funktioniert es gut. Aber ich bin gespannt, welche Auswirkungen dies auf die Performance haben könnte?

%Vor%

Wie hier gefragt, ist die Game-Klasse

%Vor%     
greyfox 16.11.2014, 13:36
quelle

3 Antworten

26

Dies tritt normalerweise auf, wenn Sie ein Objekt über @Responsebody (oder in Ihrem Fall als Antwortkörper über @RestController) zurückgeben und ein Objekt serialisiert wird, aber Kinder in einer LAZY-Sammlung hat, die nicht referenziert wurden. Zu dem Zeitpunkt, an dem Sie sich in Ihrem Controller befinden, ist keine Transaktion mehr aktiv, die Ihnen das Holen erleichtert (wie die, die Sie in Ihrem @Service gestartet haben). Sie können entweder Ihre Abrufstrategie EAGER erstellen, Ihre Sammlungen als Referenz in Ihre Transaktion einbinden oder Ihre LAZY-Sammlungen JSON Transient erstellen.

    
Randall Harleigh 17.11.2014, 00:46
quelle
6

Laden Sie zuerst jackson-datatype-hibernate4-2.2.3.jar oder höher nach jackson-core-Version herunter. Dann verwenden Sie diesen Code in der Konfigurationsdatei und Sie können die Abrufstrategie LAZY ohne Fehler verwenden.

%Vor%     
Amit Nain 27.11.2015 08:20
quelle
1

@JsonIgnore Annotation könnte Ihr Problem lösen, aber es bewirkt, dass das bestimmte Feld, das Sie ursprünglich als FetchType.LAZY festgelegt haben, vollständig ignoriert wird. Ein besseres ist hier gegeben Ссылка

    
Fatos Morina 12.01.2016 09:45
quelle