MongoDB-Escape dots'.' 在地图键]

mar*_*ark 5 spring mongodb

地图密钥codeofproduct包含点,但没有配置替换!确保地图键首先不包含点或配置适当的替换!

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)在org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:424)在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 org.springframework.da上的org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:373)中的.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:257)ta.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.在org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:451)的org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty中的MappingMongoConverter.writeInternal(MappingMongoConverter.java:373) (mapsMongoConverter.java:386)org.springframework.da上的org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 3.doWithPersistentProperty(MappingMongoConverter.java:373)位于org.springframework.data.mongodb.core的org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:373)中的ta.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:257). convert.MappingMongoConverter.writeInternal在org.springframework.data.mongodb.core.convert.MappingMongoConverter(MappingMongoConverter.java:345)在org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:310).在org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:806)的org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:859)中编写(MappingMongoConverter.java:77)在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Raf*_* G. 8

当使用Spring数据的MongoDB你得到的一个实例:org.springframework.data.mongodb.core.convert.MappingMongoConvertermapKeyDotReplacement默认设置为空-这就是为什么你得到一个例外.

您需要org.springframework.data.mongodb.core.convert.MappingMongoConverter使用其提供者setter方法创建自己的实例或仅修改现有实例:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

在MongoDB中,dot始终被视为一个特殊字符,因此避免使用它很可能会在将来为您节省一些其他麻烦.

编辑:要覆盖默认值,请MappingMongoConverter添加以下bean声明:

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

    return mongoConverter;
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

我的例外:

org.springframework.data.mapping.MappingException: Map key VAT Registration No. contains dots but no replacement was configured! Make sure map keys don't contain dots in the first place or configure an appropriate replacement!
Run Code Online (Sandbox Code Playgroud)

末尾带点的字段: VAT Registration No.

这对我不起作用:

mongoConverter.setMapKeyDotReplacement(".");
mongoConverter.setMapKeyDotReplacement("_"); //this broke enum values for example VALUE_1 -> VALUE.1
Run Code Online (Sandbox Code Playgroud)

这对我有用:

mongoConverter.setMapKeyDotReplacement("-DOT")
Run Code Online (Sandbox Code Playgroud)

完整班级:

@Configuration
public class MongoConfiguration {

    @Bean
    public MappingMongoConverter mongoConverter(MongoDbFactory mongoFactory, MongoMappingContext mongoMappingContext) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoFactory);
        MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        mongoConverter.setMapKeyDotReplacement("-DOT");
        return mongoConverter;
    }
}
Run Code Online (Sandbox Code Playgroud)