Java 对象的Redisson和Json

Java 对象的Redisson和Json,java,json,fasterxml,redisson,Java,Json,Fasterxml,Redisson,我目前正在尝试使用Redisson作为Redis客户端,到目前为止,我已经能够毫无问题地替换大量代码。我现在遇到的唯一问题是尝试使用分布式集合,例如队列或列表 List<MyEntry> entries = // read some sample data from a file RedissonClient client = // create client RBlockingQueue<MyEntry> queue = client.getBlockingQueue(

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

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);
List entries=//从文件中读取一些示例数据
RedissonClient=//创建客户端
RBlockingQueue=client.getBlockingQueue(“测试队列”,新的JsonJacksonCodec());
queue.addAll(条目);
List readBack=new ArrayList();
queue.drainTo(readBack);
当我到达最后一行时,我总是得到这个例外-

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

当我将@JsonTypeInfo添加到类中时,它似乎可以工作,但是,我没有权限将@JsonTypeInfo注释添加到大多数类中

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

我们将一如既往地感谢您的帮助

还有一点信息-我最终编写了自己的简单编解码器,它只是将一个类作为参数,并创建了一个解码器和编码器,其工作原理与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...
}
私有静态类MyCodec实现编解码器{
专用最终解码器=新解码器(){
@凌驾
公共T解码(ByteBuf buf,State State)引发IOException{
返回mapper.readValue((InputStream)new ByteBufInputStream(buf),type);
}
};
private final ObjectMapper mapper=new ObjectMapper(new MessagePackFactory());
私有最终类类型;
公共类(类类型){
this.type=type;
}
//其他方法。。。
}

我能够让我的示例正常工作-但这感觉像是一种变通方法,而不是原始问题的解决方案,我不想为我的每个实现编写额外的编解码器:)

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


我非常希望自己是错的。目前正在寻找一种不需要大手术的方法来解决这个问题。

如果可能的话,你能给我们展示一下你的
MyEntry
类吗?@Redisson\u RuiGu这是一个工作项目,但它是一个典型的POJO-每个属性都带有JsonProperty注释,单参数构造函数带有JsonCreator。我也遇到了一些问题,因为它会将一个类型序列化为类:Collections.EmptyMap,但我认为这更像是一个Jackson问题,我也有同样的问题。我有两个项目,一个是读项目,另一个是写项目。当我尝试读取我的对象列表时,我收到了相同的错误。你是如何解决这个问题的?@LucasAraújo嘿,我通过在下面的示例中创建类MyCodec来解决这个问题,并在需要提供编解码器的任何地方使用它@LucasAraújo嘿,我没有工作项目的代码,但底部的示例是其中的大部分,其余的只是需要实现的方法!这可能是如何实现其余方法的最佳示例-