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)
| 归档时间: |
|
| 查看次数: |
4786 次 |
| 最近记录: |