2012-05-11 3 views
1

J'ai une classe User qui contient une HashMap pour mapper entre deux objets personnalisés.Comment configurer la gestion des propriétés de la carte

Actuellement chaque fois que je tente de sauver l'un des utilisateurs mongodb que je reçois:

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] 

Il me semble que les données de printemps essaie de sérialiser les clés en appelant toString qui serait impossible à désérialiser.

J'ai déjà un convertisseur pour les deux classes qui peuvent transformer les instances en chaînes et vice versa, alors quel est le problème avec mon installation?

EDIT

Pour une raison quelconque anoying la classe MappingMongoConverter n'utilise pas les convertisseurs pour transformer les clés en quelque chose de facile à gérer, il utilise simplement toString de tourner la clé dans une chaîne et d'écrire la chaîne dans la dbobject .

Au cours de désérialisation la chaîne (ici traitée comme un objet) est converti en le type de clé correcte ....

Répondre

1

Je ne sais pas si le comportement est prévu, mais comme je l'ai décrit dans mon modifier la clé de carte est "sérialisé" en appelant toString (qui fonctionne pour Float, Double et autres) et désérialisé en utilisant les convertisseurs configurés. La solution de contournement pour moi consistait à appeler mon convertisseur complexClassToString dans la méthode classes toString. Ce n'était possible que parce que j'avais déjà ce convertisseur car la classe en question est utilisée comme identifiant dans mon modèle.

Questions connexes