我正在尝试使用最新的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;,那么我做错了什么?
答案 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中取回时反序列化。