Redisson和Json用于对象



我目前正在尝试将Redisson作为Redis客户端,到目前为止,我已经能够毫无问题地替换大量代码。我现在遇到的唯一问题是尝试使用分布式集合,例如Queue或List。

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);

当我到达最后一行时,我总是得到这个异常-

com.fasterxml.jackson.databind.exc.InvalidTypeIdException:尝试解析[simple type,class java.lang.Object]的子类型时缺少类型id:缺少类型id属性'@class'在[来源:(io.nety.buffer.ByteBufInputStream(;行:1,列:1439]

当我将@JsonTypeInfo添加到我的类中时,它似乎可以工作,然而,大多数我没有权限将@Json TypeInfo注释添加到的类中。

我在这里错过了什么?解决这一问题的一种方法是使用ByteArrayCodec,并使用我自己的ObjectMapper进行序列化/反序列化(编辑:尝试此操作会引发另一种类型的异常!(,但如果可能的话,我更愿意让Redisson处理此问题,因为它已经提供了许多编解码器。

像往常一样,我们非常感谢您的帮助!

更多信息-我最终编写了自己的简单编解码器,它只需将Class作为参数,并创建一个解码器和编码器,其工作方式与JsonJacksonCodec的工作方式类似,但有一个区别-

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...
}

我能够让我的例子发挥作用,但这感觉像是一种变通方法,而不是原始问题的解决方案,我不想为我的每个实现编写额外的编解码器:(

Redisson为未使用Jackson注释进行注释的类提供了默认的Jackson编解码器。您现有的注释优先于默认的编解码器设置,因此出现了问题。您可以尝试其他类型的编解码器,如fst编解码器,或者为Jackson编解码器提供自己兼容的对象映射器。

参见API基本设计缺陷——关于编码和序列化

我很想犯错。目前正在寻找一种不需要大手术的方法来解决这个问题。

最新更新