Spring在MongoDB中抛出ConverterNotFound进行日期范围内的搜索 [英] Spring throws ConverterNotFound for range search on date in MongoDB

查看:150
本文介绍了Spring在MongoDB中抛出ConverterNotFound进行日期范围内的搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对DateTime数据格式进行范围搜索.日期将以Joda的DateTime格式存储在MongoDB中.

I'm trying to do a range search on DateTime data format. The dates are being stored in Joda's DateTime format in the MongoDB.

当我对大于给定日期的数据执行FIND查询时,会引发ConverterNotFoundException.

When I do a FIND query for a data greater than a given date, the ConverterNotFoundException is being thrown.

有人可以分享有关为什么与DateTime(Joda)进行Date对象对话的信息吗?

Could someone please share information on why the conversation of Date object is being done to DateTime (Joda) &how can I possibly resolve this?

例外

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.util.Date to type org.joda.time.DateTime
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:176) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1179) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$200(MappingMongoConverter.java:78) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1133) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:869) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:282) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:270) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:309) ~[spring-data-commons-1.11.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:270) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:231) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:191) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:187) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:78) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2215) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1891) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1714) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1697) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:602) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]

应用代码

Query query = new Query();
        DateTime dateTest = new DateTime(2014, 1, 1, 0, 0);
            query.addCriteria(Criteria.where("monthYear").gte(dateTest.toDateTimeISO()));
        System.out.println(query.toString());
        List<Model> spendingsList = dbConfig.getMongoOperations().find(query, Model.class, collectionName);

生成的查询如下所示:

Query: { "monthYear" : { "$gte" : { $java : 2014-01-01T00:00:00.000+01:00 } } }, Fields: null, Sort: null

在Model类中使用的

注释

Annotation used in the Model class

@DateTimeFormat(iso = ISO.DATE_TIME)
    private DateTime monthYear;

推荐答案

在调查了此行为之后,发现了以下问题和解决方案.

After investigating this behavior, found the following issues and solutions.

问题

当从不同的MongoDB UI读取数据类型时,对MongoDB中存储的数据的解释会有所不同.例如:Mongovue将该类型解释为DateTime,DBeaver将该类型解释为Timestamp

The data stored in the MongoDB is interpreted differently when the data type is read from different MongoDB UIs. Eg: Mongovue interprets the type as DateTime, DBeaver interprets it as Timestamp

解决方案 从应用程序中查询带有日期时间对象(日期格式)的数据库.

Solution Query the DB from the application with the date time object in Date format.

示例

int year;
DateTime monthYearFrom = new DateTime(year, 1, 1, 1, 0);
DateTime monthYearTo = new DateTime((year+1), 1, 1, 1, 0);
query.addCriteria(Criteria.where("monthYear").gte(monthYearFrom.toDate()).lte(monthYearTo.toDate()));

这篇关于Spring在MongoDB中抛出ConverterNotFound进行日期范围内的搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆