private Map<String, CustomObject> lookupTable
内部的にCustomObject
は、値をすばやく検索するためにマップを使用しid
ますlookupTable
。マップのキーをシリアル化するのはばかげているので、値のみをシリアル化するように内部変数に注釈を付けたいと思います。これは明らかに機能しません:
@JsonSerialize(as = List.class)
private final Map<String, CustomObject> lookupTable;
カスタムシリアライザーが機能しない理由
次のようなカスタムシリアライザーを作成しました。
public static class MapValuesJsonSerializer extends JsonSerializer<Map<?, ?>> {
@Override
public void serialize(
Map<?, ?> value,
JsonGenerator generator,
SerializerProvider provider)
throws IOException, JsonProcessingException {
generator.writeObject(value.values());
}
}
次に、それに応じてフィールドに注釈を付けました。
@JsonSerialize(using = MapValuesJsonSerializer.class)
public Map<String, CustomObject> lookupTable;
これは一部の Java テスト コードでは機能しますが、MongoDB のドライバーと MongoJack を使用すると機能しなくなります。役に立たない例外が発生します。これは、返されたオブジェクトを実際にシリアル化するのではなく、その生のオブジェクトを BSON シリアライザーに渡そうとしているためだと思います。
Caused by: java.lang.IllegalArgumentException: can't serialize class CustomObject
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:239)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
at com.mongodb.DBCollection.insert(DBCollection.java:148)
at com.mongodb.DBCollection.insert(DBCollection.java:91)
at org.mongojack.JacksonDBCollection.insert(JacksonDBCollection.java:255)
// My code (not the serializer)...