7

我在现有数据库上使用 Spring Data for Mongo。之前的应用程序使用纯字符串作为 id 而不是 ObjectId。

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

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

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

谢谢!

迭戈

4

5 回答 5

2

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

我所做的是将转换器从使用String中删除。这样,我创建了以下 Mongo 转换器:ObjectIdMongoTemplateQueryMapper

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.

于 2013-01-15T03:10:47.803 回答
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;
  }

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

于 2017-06-06T12:14:16.740 回答
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。爪哇#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;
    }
    ...
}
于 2020-07-10T21:04:08.147 回答
0

我找到了一种更简单的方法来处理相同的serhii 方法,您只需convertIdMobileMappingMongoConverter类中覆盖方法,您会在这篇文章中找到它。

于 2020-11-30T08:15:21.673 回答
0

您可以使用字段注释。

import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
import org.springframework.data.mongodb.core.mapping.Document;

@Document    
public class Dog{
@Id
@Field(targetType = FieldType.STRING)
String myId;
...
}
于 2022-02-16T18:00:54.160 回答