如何为MongoDbMessageStore.MessageReadingMongoConverter设置mapKeyDotReplacement

时间:2017-11-29 15:21:06

标签: java spring-integration

我正在使用MongoDbMessageStore来存储传入的AMQP消息。消息具有标题,其键包含点。当消息即将在MongoDB中保留时,会抛出异常:

org.springframework.data.mapping.model.MappingException: Map key lnu_ocr_core.ocr.rabbitmq_ver 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:714)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.prepareMapKey(MappingMongoConverter.java:696)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeMapInternal(MappingMongoConverter.java:663)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createMap(MappingMongoConverter.java:593)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:478)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:437)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:425)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:330)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:425)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:399)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:363)
    at org.springframework.integration.mongodb.store.MongoDbMessageStore$MessageReadingMongoConverter.write(MongoDbMessageStore.java:530)
    at org.springframework.integration.mongodb.store.MongoDbMessageStore$MessageReadingMongoConverter.write(MongoDbMessageStore.java:497)
    at org.springframework.data.mongodb.core.MongoTemplate.toDbObject(MongoTemplate.java:873)
    at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:855)
    at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:799)
    at org.springframework.integration.mongodb.store.MongoDbMessageStore.addMessageDocument(MongoDbMessageStore.java:228)
    at org.springframework.integration.mongodb.store.MongoDbMessageStore.addMessagesToGroup(MongoDbMessageStore.java:303)
    at org.springframework.integration.store.AbstractMessageGroupStore.addMessageToGroup(AbstractMessageGroupStore.java:209)
    at org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler.store(AbstractCorrelatingMessageHandler.java:621)
    at org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler.handleMessageInternal(AbstractCorrelatingMessageHandler.java:413)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    ...

我知道要解决这个问题,我必须在mapKeyDotReplacement上设置MappingMongoConverter。但是,MongoDbMessageStore使用内部创建和配置的私有MongoDbMessageStore.MessageReadingMongoConverter实例。有没有办法在那里设置mapKeyDotReplacement

1 个答案:

答案 0 :(得分:3)

你必须放弃那个不方便的MongoDbMessageStore,而不是ConfigurableMongoDbMessageStore。在语义上它们是相同的,并且可以使用外部MappingMongoConverter配置这个:

public ConfigurableMongoDbMessageStore(MongoDbFactory mongoDbFactory, MappingMongoConverter mappingMongoConverter) {

https://docs.spring.io/spring-integration/docs/5.0.0.RELEASE/reference/html/mongodb.html#mongodb-message-store