防止Mongo的Spring数据将id转换为ObjectId

时间:2013-01-15 00:17:45

标签: mongodb spring-data-mongodb

我在现有数据库上使用Spring Data for Mongo。前一个应用程序使用普通字符串代替ObjectId。

我的问题是Spring Data坚持将字符串转换为ObjectId,这会使所有查询都失败。

例如,当我执行repository.findOne('')时,执行的查询为{ "_id" : { "$oid" : "50cf9f34458cf91108ceb2b4"}}时应为{ "_id" : "50cf9f34458cf91108ceb2b4" }

有没有办法避免Spring Data将字符串ID转换为ObjectId?

谢谢!

4 个答案:

答案 0 :(得分:2)

我终于找到了解决方案。可能不是最好的选择,但有效。

我所做的是将转换器从String移至ObjectIdMongoTemplate使用QueryMapper。这样,我创建了以下Mongo转换器:

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();
            }
        });
    }
}

然后,我将转换器的实现传递给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>

这样,当尝试从String转换为ObjectId时,它会抛出异常并且不会执行此操作。请注意,您可以从conversionService删除转换器。

答案 1 :(得分:1)

我遇到了同样的问题,我的解决方案如下:

  @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;
  }

这个想法是为了防止默认转换器注册。

答案 2 :(得分:0)

现在足够覆盖MappingMongoConverter中的convertId方法。

默认为此处https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverter.java#L128。如我们所见,conversionService不会那么有用。

这是我的配置的一部分(我的集合中根本不需要字符串中的ObjectId):

@Configuration
public class MongoCommonConfig extends AbstractMongoClientConfiguration {
    ...
    @Bean
    @Primary
    public MongoTemplate mongoTemplate(MongoDbFactory dbFactory, 
        MappingMongoConverter mappingMongoConverter) {
        return new MongoTemplate(dbFactory, mappingMongoConverter);
    }

    @Bean
    @Primary
    @Override
    public @NotNull MappingMongoConverter mappingMongoConverter() throws Exception {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()) {
            @Override
            public Object convertId(Object id, @NotNull Class<?> targetType) {
                return id;
            }
        };
        converter.setCustomConversions(customConversions());
        converter.setCodecRegistryProvider(mongoDbFactory());

        return converter;
    }
    ...
}

答案 3 :(得分:0)

我找到了一种更简单的方法来处理同一serhii 在仅覆盖convertId类中的方法MobileMappingMongoConverter的地方,您将在此post中找到它。