我在现有数据库上使用Spring Data for Mongo。前一个应用程序使用普通字符串代替ObjectId。
我的问题是Spring Data坚持将字符串转换为ObjectId,这会使所有查询都失败。
例如,当我执行repository.findOne('')
时,执行的查询为{ "_id" : { "$oid" : "50cf9f34458cf91108ceb2b4"}}
时应为{ "_id" : "50cf9f34458cf91108ceb2b4" }
有没有办法避免Spring Data将字符串ID转换为ObjectId?
谢谢!
迭
答案 0 :(得分:2)
我终于找到了解决方案。可能不是最好的选择,但有效。
我所做的是将转换器从String
移至ObjectId
,MongoTemplate
使用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)