1

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)...
4

1 に答える 1

2

もちろん、質問するとすぐに解決策を見つけます。

上記のシリアライザを使用してprovider、直接ではなく を使用して値をシリアライズしますgenerator。コードは次のとおりです。

/**
 * <p>
 * Serializes the values of some map into a list.
 * <p>
 *
 * @author John Jenkins
 */
public class MapValuesJsonSerializer extends JsonSerializer<Map<?, ?>> {
    /*
     * (non-Javadoc)
     * @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
     */
    @Override
    public void serialize(
        final Map<?, ?> value,
        final JsonGenerator generator,
        final SerializerProvider provider)
        throws IOException, JsonProcessingException {

        provider.defaultSerializeValue(value.values(), generator);
    }
}
于 2013-11-01T17:34:36.630 に答える