2012-05-11 3 views
1

У меня есть пользовательский класс, который содержит HashMap для сопоставления между двумя настраиваемыми объектами.Как настроить обработку свойств карты

В настоящее время всякий раз, когда я пытаюсь сохранить один из пользователей в MongoDB я получаю:

org.springframework.data.mapping.model.MappingException: Map key [email protected] contains dots but no replacement was configured! Make sure map keys don't contain dots in the first place or configure an appropriate replacement! 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.potentiallyEscapeMapKey(MappingMongoConverter.java:548) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeMapInternal(MappingMongoConverter.java:512) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:385) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:346) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:335) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:173) ~[spring-data-commons-core-1.2.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:335) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:307) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:272) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:73) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:717) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:707) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:703) ~[spring-data-mongodb-1.0.1.RELEASE.jar:na] 
at net.bigpoint.globalchat.hazelcast.MongoMapStore.store(MongoMapStore.java:81) [classes/:na] 
at net.bigpoint.globalchat.hazelcast.MongoMapStore.store(MongoMapStore.java:1) [classes/:na] 
at com.hazelcast.impl.concurrentmap.MapStoreWrapper.store(MapStoreWrapper.java:110) [hazelcast-2.0.2.jar:2.0.2] 
at com.hazelcast.impl.ConcurrentMapManager$PutOperationHandler$PutStorer.doMapStoreOperation(ConcurrentMapManager.java:2736) [hazelcast-2.0.2.jar:2.0.2] 
at com.hazelcast.impl.ConcurrentMapManager$AbstractMapStoreOperation.run(ConcurrentMapManager.java:3440) [hazelcast-2.0.2.jar:2.0.2] 
at com.hazelcast.impl.executor.ParallelExecutorService$ParallelExecutorImpl$ExecutionSegment.run(ParallelExecutorService.java:212) [hazelcast-2.0.2.jar:2.0.2] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_04] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_04] 
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_04] 

Мне кажется, что весной данные пытается сериализовать ключи по телефону ToString, которое было бы невозможно десериализации.

У меня уже есть конвертер для обоих классов, который может превращать экземпляры в строки и наоборот, так что же не так с моей настройкой?

EDIT

По какой-то причине anoying класс MappingMongoConverter не использует конвертеры превратить ключи в чем-то управляемым, он просто использует ToString, чтобы повернуть ключ в строку и записать строку в DBObject ,

Во время десериализации строка (здесь обрабатывается как объект) преобразуется в правильный тип ключа ....

ответ

1

Я не уверен, если поведение предназначено, но, как я описал в моем редактировать клавишу на карте «сериализуется», вызывая toString (который работает для Float, Double и т. п.) и десериализуется с помощью сконфигурированных преобразователей.

поэтому обходной путь для меня состоял в том, чтобы вызвать мой конвертер complexClassToString в классе toString. Это было возможно только потому, что у меня уже был этот конвертер, потому что рассматриваемый класс используется как идентификатор в моей модели.

Смежные вопросы