如何在没有ObjectId的情况下将Mongo与Spring数据一起使用

use*_*848 6 java spring-data spring-data-mongodb spring-boot

我有一个现有的mongo数据库,其中id(_id)保留为纯字符串。.这是Mongo DB中的示例数据:

{
    "_id" : "528bb0e2e4b0442f1479f1b4",
    "schoolId" : "URDLKYLFJXLWJGR193778316742298",
    "surname" : "Lewis",
    "admissionNumber" : "0347",
    "firstName" : "Martins"
}
Run Code Online (Sandbox Code Playgroud)

我有一个Java对象,其形式为:

public class Student {

@Id
private String id;
private String schoolId;
private String surname;
private String admissionNumber;
private String firstName;
}
Run Code Online (Sandbox Code Playgroud)

与吸气剂和二传手

我也有一个存储库:

public interface StudentRepository extends MongoRepository<Student, String> {

    Student findOneBySurname(String surname);
    Student findOneById(String id);
    Student findOneBySurnameAndFirstName(String surname, String firstName);
}
Run Code Online (Sandbox Code Playgroud)

当我执行一个studentRepository.findAll()时,我能够正确地填充数据库中的所有Student及其所有字段。

当我执行studentRepository.findOne(“ 528bb0e2e4b0442f1479f1b4”)或studentRepository.findOneById)“ 528bb0e2e4b0442f1479f1b4”)时,它返回null

当我调试mongo查询时,我可以看到它正在调用:

2015-11-19 16:06:32.327 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoTemplate      : findOne using query: { "id" : "528bb0e2e4b0442f1479f1b4"} fields: null for class: class com.ad.josh.domain.Student in collection: Student
    2015-11-19 16:06:32.331 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoDbUtils       : Getting Mongo Database name=[joshdb]
    2015-11-19 16:06:32.333 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoTemplate      : findOne using query: { "_id" : { "$oid" : "528bb0e2e4b0442f1479f1b4"}} in db.collection: josh.Student
Run Code Online (Sandbox Code Playgroud)

通常,我可以看到它仍在使用对象ID而不是纯字符串进行查询。

我看到了以下建议:

创建一个引发RuntimeException的Converter

但这是行不通的。它只是抛出一个RuntimeException。

任何有关如何使用Spring Data访问Mongo数据库的建议(在现有数据库中)都已被Ind定义为String。

Leo*_*ley -1

可行的解决方法是为 ObjectId 创建您自己的转换器。

您可以通过提供 MappingMongoConverter 类型的 @Bean 来自定义 mongo 映射器

@Configuration
public class MongoConfig {

    @Bean
    public CustomConversions customConversions() {
        List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
        converters.add(new MyObjectIdConverter());
        return new CustomConversions(converters);
    }

    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        try {
            mappingConverter.setCustomConversions(customConversions());
        }
        catch (NoSuchBeanDefinitionException ignore) {}

        // Don't save _class to mongo
        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return mappingConverter;
    }

}
Run Code Online (Sandbox Code Playgroud)