2017-08-28 6 views
3

Ich probiere derzeit Redisson als Redis-Client und bisher konnte ich einen guten Teil des Codes ohne Probleme ersetzen. Das einzige Problem, das ich jetzt habe, ist der Versuch, die verteilten Sammlungen wie Warteschlange oder Liste zu verwenden.Redisson und Json für Objekte

List<MyEntry> entries = // read some sample data from a file 
RedissonClient client = // create client 
RBlockingQueue<MyEntry> queue = client.getBlockingQueue("test-queue", new JsonJacksonCodec()); 

queue.addAll(entries); 
List<MyEntry> readBack = new ArrayList<>(); 
queue.drainTo(readBack); 

Als ich in die letzte Zeile bekommen, habe ich immer diese Ausnahme -

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Fehlende Typ-ID, wenn sie versuchen Subtyp von [einfach zu lösen type, class java.lang.Object]: fehlende Typ-ID-Eigenschaft '@class' um [Quelle: (io.netty.buffer.ByteBufInputStream); Zeile: 1, Spalte: 1439]

Als ich @JsonTypeInfo meiner Klasse hinzufügen, wird es jedoch zu arbeiten, die meisten Klassen habe ich keinen Zugriff die @JsonTypeInfo Annotation hinzuzufügen.

Ich vermisse etwas hier? Eine Möglichkeit, dies zu umgehen, könnte darin bestehen, den ByteArrayCodec zu verwenden und mit meinem eigenen ObjectMapper zu serialisieren/deserialisieren (edit: das versucht einen anderen Typ von Exception auszulösen!), Aber wenn möglich würde ich Redisson lieber behandeln lassen, da es viele Codecs anbietet bereits.

Jede Hilfe wird wie gewohnt sehr geschätzt!

ein bisschen mehr Infos - Ich landete meine eigenen einfachen Codec schreiben, die einfach eine Klasse als Parameter übernimmt, und erstellt einen Decoder und Encoder arbeitet ähnlich, wie die JsonJacksonCodec arbeitet, mit einem Unterschied -

private static class MyCodec<T> implements Codec { 

    private final Decoder<Object> decoder = new Decoder<Object>() { 
     @Override 
     public T decode(ByteBuf buf, State state) throws IOException { 
      return mapper.readValue((InputStream) new ByteBufInputStream(buf), type); 
     } 
    }; 

    private final ObjectMapper mapper = new ObjectMapper(new MessagePackFactory()); 
    private final Class<T> type; 

    public MyCodec(Class<T> type) { 
     this.type = type; 
    } 

    // rest of methods... 
} 

Und ich war in der Lage, mein Beispiel zu arbeiten - aber das fühlt sich eher wie eine Umgehungslösung, anstatt eine Lösung für das ursprüngliche Problem, und ich möchte nicht zusätzliche Codecs für jede Implementierung, die ich habe :)

+0

Können Sie uns Ihre 'MyEntry' Klasse zeigen, wenn das möglich ist? –

+0

@Redisson_RuiGu ist ein Arbeitsprojekt, aber es ist ein typisches POJO - jede Eigenschaft mit einer JsonProperty-Annotation, alle Argumentkonstruktoren mit JsonCreator. Ich hatte auch einige Probleme, wenn es einen Typ als etwas wie Klasse klassifizieren würde: Collections.EmptyMap, aber ich denke, dass das mehr ein Jackson-Problem ist – KingTravisG

Antwort

1

Redisson bietet einen standardmäßigen Jackson-Codec für Klassen, die NICHT mit Jackson-Anmerkungen versehen sind. Ihre vorhandenen Anmerkungen haben Vorrang vor der Standard-Codec-Einstellung, daher das Problem. Sie können andere Arten von Codec wie FST-Codec versuchen oder Ihre eigene kompatible Objekt-Mapper zum Jackson Codec liefern.