Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent Spring Data for Mongo to convert ids to ObjectId

I'm using Spring Data for Mongo on an existing database. The previous application used plain strings for ids instead of ObjectId.

My problem is that Spring Data insists on converting the strings to ObjectId, which makes all queries by id to fail.

For example, when I do repository.findOne(''), the query executed is { "_id" : { "$oid" : "50cf9f34458cf91108ceb2b4"}} when it should be { "_id" : "50cf9f34458cf91108ceb2b4" }

Is there a way to avoid Spring Data to convert string ids to ObjectId?

Thanks!

Diego

like image 214
dgaviola Avatar asked Jan 15 '13 00:01

dgaviola


2 Answers

I finally found a solution for this. Probably not the best option, but works.

What I did was remove the converter from String to ObjectId that MongoTemplate uses through QueryMapper. This way, I created the following Mongo converter:

public class CustomMongoConverter extends MappingMongoConverter {
    public CustomMongoConverter(MongoDbFactory mongoDbFactory, MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext) {
        super(mongoDbFactory, mappingContext);
        conversionService.addConverter(new Converter<String, ObjectId>() {
            @Override
            public ObjectId convert(String source) {
                throw new RuntimeException();
            }
        });
    }
}

And then, I passed that implementation of the converter to MongoTemplate:

<bean id="mongoConverter" class="com.abcompany.model.repositories.utils.CustomMongoConverter">
    <constructor-arg ref="mongoDbFactory"/>
    <constructor-arg>
        <bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>
    </constructor-arg>
</bean>

<bean class="org.springframework.data.mongodb.core.MongoTemplate" id="mongoTemplate">
    <constructor-arg ref="mongoDbFactory"/>
    <constructor-arg ref="mongoConverter"/>
</bean>

This way, when trying to convert from String to ObjectId, it throws an exception and it doesn't do it. Please note that you probably can just remove the converter from conversionService.

like image 59
dgaviola Avatar answered Oct 05 '22 20:10

dgaviola


I've faced same problem and my solution was like below:

  @Bean
  public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, CustomConversions conversions) {
    MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), context) {
      @Override
      public void afterPropertiesSet() {
        conversions.registerConvertersIn(conversionService);
      }
    };
    converter.setCustomConversions(conversions);
    return converter;
  }

The idea is to prevent default converters registration.

like image 29
Sergii Motynga Avatar answered Oct 05 '22 22:10

Sergii Motynga