2016-07-24 7 views
0

Ich habe eine Klasse, die viele einfache Attribute hat (Typ ist int, String, ...). Es hat auch ein Attribut, das eine Instanz einer anderen Klasse von mir ist. Jetzt möchte ich das Objekt über einen Redis-Pub/Sub-Kanal senden. Dazu serialisiere ich es mit der GenericJackson2JsonRedisSerializer. Da beide Klassen über ein eigenes Repository verfügen, möchte ich das Objekt nicht jedes Mal einbetten, sondern nur die ID senden. Ich dachte, dass dies möglich sein sollte, indem Sie die org.springframework.data.annotation.Reference Annotation zu dem Feld hinzufügen.Spring Redis JSON Serializer bettet referenziertes Feld

Leider hat dies nicht funktioniert, sondern bettet das Objekt ein. Habe ich irgendetwas falsch gemacht? Was muss ich tun, um die ID des Objekts in der serialisierten Version zu erhalten?

Vielen Dank für Ihre Hilfe!

Antwort

0

Ordnung nach viel zu viel Forschung für eine solche grundlegende Sache, schließlich habe ich herausgefunden, wie es geht.

Grundsätzlich musste ich die com.fasterxml.jackson.annotation.JsonIdentityInfo Annotation der Klasse oder Feld hinzufügen. Wie bereits in der Frage ausgeführt, ergab dies das gleiche Ergebnis, erstmalig vollständig enthalten, danach nur referenziert.

Keine Dokumentation erwähnt, wie immer die ID haben, musste ich in den Code suchen: Es gibt eine weitere Anmerkung com.fasterxml.jackson.annotation.JsonIdentityReference, die eine boolesche Eigenschaft namens alwaysAsId hat. Wenn Sie diese Option auf "true" setzen, wird immer die ID anstelle des Objekts hinzugefügt.

Um das Deserialisieren zu erhalten, muss man einen benutzerdefinierten Resolver für die IDs angeben. Da ich Spring benutze, war es ziemlich einfach, auf mein Repository zuzugreifen.

0

Haben Sie Federdaten Redis verwendet? http://projects.spring.io/spring-data-redis/

prüfen http://docs.spring.io/spring-data/redis/docs/current/reference/html/#redis.repositories.references

Wenn Sie nicht Spring Data Redis verwenden ich glaube, Sie müssen sollten Sie Ihre eigenen Referenz, wenn serialize/deserialisieren Ihre Daten implementieren.

Sie können Ihre eigenen Serializer mit

YourObjectSerializer implementiert erweitert Jackson2JsonRedisSerializer

+0

Ja, ich benutze Spring Data Redis, ich werde versuchen, was Sie vorgeschlagen haben und informieren Sie darüber, ob es funktioniert. – Frozn

+0

Wenn ich es ausprobiert hätte, wäre das Schreiben eines benutzerdefinierten Serialisierers auch mein Ansatz gewesen, wenn es nicht anders funktioniert. Trotzdem danke für deine Hilfe! – Frozn

Verwandte Themen