2016-09-30 2 views
2

Ключ-код ключаofproduct содержит точки, но замена не была настроена! Убедитесь, что ключи карты не содержат точек в первую очередь, или настройте соответствующую замену!MongoDB-Escape dots '.' в карте]

org.springframework.data.mapping.model.MappingException: Ключ карты foo.bar.key содержит точки, но замена не была настроена! Убедитесь, что ключи карты не содержат точек в первую очередь, или настройте соответствующую замену! на org.springframework.data.mongodb.core.convert.MappingMongoConverter.potentiallyEscapeMapKey (MappingMongoConverter.java:622) на org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeMapInternal (MappingMongoConverter.java:586) на org.springframework.data.mongodb.core.convert.MappingMongoConverter.createMap (MappingMongoConverter.java:517) at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal (MappingMongoConverter.java:424) at org. springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter.java:386) at org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter.java:373) at org. springframework.d ata.mapping.model.BasicPersistentEntity.doWithProperties (BasicPersistentEntity.java:257) на org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal (MappingMongoConverter.java:373) на org.springframework.data.mongodb. core.convert.MappingMongoConverter.writePropertyInternal (MappingMongoConverter.java:451) на org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter.java:386) на org.springframework.data.mongodb.core .convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter.java:373) на org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties (BasicPersistentEntity.java:257) на org.springframework.data.mongodb.core.convert. MappingMongoConverter.writeInternal (MappingMongoC onverter.java:373) на org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal (MappingMongoConverter.java:451) в org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter .java: 386) at org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty (MappingMongoConverter.java:373) at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties (BasicPersistentEntity.java: 257) at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal (MappingMongoConverter.java:373) at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal (MappingMongoConverter.java:345) at org.springframe work.data.mongodb.core.convert.MappingMongoConverter.write (MappingMongoConverter.java:310) at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write (MappingMongoConverter.java:77) at org.springframework. data.mongodb.core.MongoTemplate.doSave (MongoTemplate.java:859) на org.springframework.data.mongodb.core.MongoTemplate.save (MongoTemplate.java:806) на org.springframework.data.mongodb.core. MongoTemplate.save (MongoTemplate.java:794)

Когда мы пытаемся вставить значение, это происходит. Как мы можем это решить?

это мой класс

@Configuration 
@EnableMongoRepositories("net.ooo.hepsiburada.**.repository") 
@Profile(Constants.SPRING_PROFILE_CLOUD) 
public class CloudMongoDbConfiguration extends AbstractMongoConfiguration { 

    private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); 

    @Inject 
    private MongoDbFactory mongoDbFactory; 

    @Bean 
    public ValidatingMongoEventListener validatingMongoEventListener() { 
     return new ValidatingMongoEventListener(validator()); 
    } 

    @Bean 
    public LocalValidatorFactoryBean validator() { 
     return new LocalValidatorFactoryBean(); 
    } 

    @Bean 
    public CustomConversions customConversions() { 
     List<Converter<?, ?>> converterList = new ArrayList<>();; 
     converterList.add(DateToZonedDateTimeConverter.INSTANCE); 
     converterList.add(ZonedDateTimeToDateConverter.INSTANCE); 
     converterList.add(DateToLocalDateConverter.INSTANCE); 
     converterList.add(LocalDateToDateConverter.INSTANCE); 
     converterList.add(DateToLocalDateTimeConverter.INSTANCE); 
     converterList.add(LocalDateTimeToDateConverter.INSTANCE); 
     return new CustomConversions(converterList); 
    } 

    @Override 
    protected String getDatabaseName() { 
     return mongoDbFactory.getDb().getName(); 
    } 

    @Override 
    public Mongo mongo() throws Exception { 
     return mongoDbFactory().getDb().getMongo(); 
    } 
} 

ответ

4

При использовании Spring Data MongoDB вы получаете экземпляр: org.springframework.data.mongodb.core.convert.MappingMongoConverter который имеет mapKeyDotReplacement присваивается нулевое значение по умолчанию - именно поэтому вы получаете исключение.

Вы должны либо создать свой собственный экземпляр org.springframework.data.mongodb.core.convert.MappingMongoConverter или просто изменить существующий экземпляр, используя поставщика метод установки:

/** 
* Configure the characters dots potentially contained in a {@link Map} shall be replaced with. By default we don't do 
* any translation but rather reject a {@link Map} with keys containing dots causing the conversion for the entire 
* object to fail. If further customization of the translation is needed, have a look at 
* {@link #potentiallyEscapeMapKey(String)} as well as {@link #potentiallyUnescapeMapKey(String)}. 
* 
* @param mapKeyDotReplacement the mapKeyDotReplacement to set 
*/ 
public void setMapKeyDotReplacement(String mapKeyDotReplacement) { 
    this.mapKeyDotReplacement = mapKeyDotReplacement; 
} 

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

EDIT: Чтобы переопределить значение по умолчанию MappingMongoConverter добавить следующее объявление боба:

@Bean 
    public MappingMongoConverter mongoConverter(MongoDbFactory mongoFactory) throws Exception { 
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoFactory); 
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext); 
    mongoConverter.setMapKeyDotReplacement("."); 

    return mongoConverter; 
    } 
+0

Куда я могу поместить эту модификацию? – mark

+0

Посмотрите это q & a: http://stackoverflow.com/questions/35598595/how-to-customize-mappingmongoconverter-setmapkeydotreplacement-in-spring-boot –

+0

Я добавил свой класс. внутри этого класса? но как? – mark

0

Для конфигурации XML следующий будет полезно.

Примечание: для этого используется бранд mongoConverter. Он заменит «.». с ключом «_»

<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> 

<mongo:auditing mapping-context-ref="mappingContext"/> 

<mongo:db-factory id="mongoDbFactory" mongo-ref="mongoClient" dbname="${mongo.dbname}"/> 

<bean id ="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> 
    <constructor-arg name="mappingContext" ref="mappingContext"/> 
    <property name="mapKeyDotReplacement" value="_"></property> 
</bean> 

<mongo:mongo-client id="mongoClient" credentials="${mongo.credential}" > 
    <mongo:client-options connections-per-host="50" threads-allowed-to-block-for-connection-multiplier="5000" /> 
</mongo:mongo-client> 

<!-- MongoDB Template --> 
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> 
    <constructor-arg name="mongoConverter" ref="mongoConverter"/> 
</bean> 
Смежные вопросы