2017-08-28 3 views
3

私は現在、RedisonクライアントとしてRedissonを試していますが、これまでは問題のないコードを置き換えることができました。私が今行っている唯一の問題は、キューやリストなどの分散コレクションを使用しようとすることです。 [シンプルのサブタイプを解決しようとすると、不足しているタイプID:オブジェクト用のRedissonとJson

com.fasterxml.jackson.databind.exc.InvalidTypeIdException - 私は最後の行に到達すると、私はいつもこの例外を取得

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

型、クラスjava.lang.Object]:タイプIDプロパティ '@class'がありません。 [ソース:(io.netty.buffer.ByteBufInputStream);行:1、列:私は私のクラスに@JsonTypeInfoを追加すると1439]

、しかし、私は@JsonTypeInfoアノテーションを追加するアクセス権を持っていないクラスのほとんどを仕事に表示されます。

ここに何か不足していますか?これを回避する1つの方法は、ByteArrayCodecを使用し、自分のObjectMapperを使用してシリアル化/逆シリアル化することです(編集:別のタイプの例外をスローしようとしました!)可能であれば、多くのコーデック既に。

いつものように助けてください!

もう少し情報 - 私は単純に1つの違いで、パラメータとしてクラスをとり、およびデコーダを作成し、エンコーダが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... 
} 

私の例はうまくいきましたが、元の問題の解決策ではなく、回避策のように感じました。私は、それぞれの実装にコーデックを追加する必要はありません:)

+0

あなたの「MyEntry」クラスを表示できますか? –

+0

@Redisson_RuiGuこれは作業プロジェクトですが、典​​型的なPOJOです.JsonPropertyアノテーションを持つすべてのプロパティ、JsonCreatorを持つすべての引数コンストラクタが1つです。私はクラスのようなものとして型をシリアライズするといういくつかの問題もありました:Collections.EmptyMap、しかしそれはもっとジャクソンの問題だと思います – KingTravisG

答えて

1

Redissonは、Jackson注釈で注釈付けされていないクラスに対して、デフォルトのJacksonコーデックを提供します。既存の注釈がデフォルトのコーデック設定よりも優先されるため、問題が発生します。あなたは、fstコーデックのような他のタイプのコーデックを試すか、またはジャクソンコーデックに互換性のあるオブジェクトマッパーを供給することができます。

関連する問題