Spring 抛出 ConverterNotFound 以在 MongoDB 日期进行范围搜索

Spring throws ConverterNotFound for range search on date in MongoDB

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

当我对大于给定日期的数据执行 FIND 查询时,抛出 ConverterNotFoundException。

有人可以分享有关为什么 Date 对象的对话正在与 DateTime (Joda) 进行的信息吗?我怎样才能解决这个问题?

异常

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.access0(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.doWithPersistentProperty(MappingMongoConverter.java:282) ~[spring-data-mongodb-1.8.1.RELEASE.jar:na]
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.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

模型中使用的注释 class

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

调查此行为后,发现以下问题和解决方案。

问题

当从不同的 MongoDB UI 读取数据类型时,存储在 MongoDB 中的数据的解释不同。 eg:Mongovue将类型解释为DateTime,DBeaver将其解释为Timestamp

解决方案 使用日期格式的日期时间对象从应用程序查询数据库。

例子

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()));