mappingMongoConverter.setMapKeyDotReplacement似乎没有任何效果

时间:2015-08-07 16:43:28

标签: spring-data-mongodb

我正在尝试使用最新的1.7.2 spring mongodb转换包含包含虚线键字符串值的地图的自定义对象。

设置点替换似乎不能完成这项工作。这是我的代码:

class FakeUser {
    Map<String, String> map = new LinkedHashMap<>();

    void addValue(String key, String value) {
        this.map.put(key, value);
    }
}

FakeUser fakeUser = new FakeUser();
fakeUser.addValue("test.dot.for.key", "test.dot.for.value");
this.mappingMongoConverter.setMapKeyDotReplacement(":");
Object convertedObject = this.mappingMongoConverter.convertToMongoType(fakeUser);
System.out.println("convertedObject: " + convertedObject.getClass() + ":" + convertedObject);

输出:

convertedObject: class com.mongodb.BasicDBObject:{ "map" : { "test.dot.for.key" : "test.dot.for.value"}}

我也尝试过:

class FakeUser {
    Map<String, String> map = new LinkedHashMap<>();

    void addValue(String key, String value) {
        this.map.put(key, value);
    }
}

FakeUser fakeUser = new FakeUser();
fakeUser.addValue("test.dot.for.key", "test.dot.for.value");
this.mappingMongoConverter.setMapKeyDotReplacement(":");
BasicDBObject dbo = new BasicDBObject();
this.mappingMongoConverter.write(fakeUser, dbo);
System.out.println("dbo: " + ":" + dbo.toMap());

并输出dbo: :{_class=app.security.MyClass$1FakeUser, map={ "test.dot.for.key" : "test.dot.for.value"}}

我期待&#34; test.dot.for.key&#34;成为&#34;测试:dot:for:key&#34;,那么我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要在SpringMongoDBConfig(应该扩展AbstractMongoConfiguration)配置文件中调整转换器,而不是在您尝试序列化/反序列化的类中。如果您正在使用注释驱动设置,则可以使用自定义bean来设置转换器,如下所示:

@Bean
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception
{
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext());
    converter.setCustomConversions(customConversions());
    //mongo won't accept key values with dots(.) in them, so configure it to store them as :
    converter.setMapKeyDotReplacement("\\:");

    return converter;
}

设置转换器后,它将自动为您处理序列化和反序列化。

如果你真的想在线进行转换(不推荐),你可以使用字符串替换函数来重写字符串,如下所示:

class FakeUser 
{
    Map<String, String> map = new LinkedHashMap<>();

    void addValue(String key, String value) {
        key = key.replace(".",":");
        this.map.put(key, value);
    }
}

虽然如果你内联它,你可能会在你从mongo中取回时反序列化。