2016-07-22 43 views
0

我有以下的庫:MongoRepository的findAll與ZonedDateTime謂語運行到CodecConfigurationException

public interface MyRepository extends MongoRepository<MyDocument, String>, QueryDslPredicateExecutor<MyDocument>{ ... 

我寫了一個類,它提供了一些謂詞對我來說,一個是二ZonedDateTimes

public static Predicate hasTimeBeetween(final ZonedDateTime from, final ZonedDateTime to) { 
    return QMyDocument.myDocument.remoteTime.between(from, to); 
} 
的時間幀之間搜索

如果我不打電話是謂語一切的findAll方法是好的,如果我添加了謂詞如下

ZonedDateTime now = ZonedDateTime.now(); 
    MyDocument cNow = this.createInDatabase(this.createDocumentInDatabase(now)); 

    Iterable<CrudNut> findAll = this.repository.findAll(CrudNutPredicates.hasTimeBeetween(now.minusDays(1), now.plusDays(1))); 

我以下異常運行:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.time.ZonedDateTime. 
at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46) 
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63) 
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37) 
at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210) 
at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) 
at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) 
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128) 
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61) 
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63) 
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29) 
at org.bson.codecs.EncoderContext.encodeWithChildContext(EncoderContext.java:91) 
at org.bson.codecs.BsonDocumentCodec.writeValue(BsonDocumentCodec.java:133) 
at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:112) 
at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:40) 
at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:253) 
at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:205) 
at com.mongodb.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:75) 
at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160) 
at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:192) 
at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111) 
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159) 
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286) 
at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173) 
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215) 
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206) 
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112) 
at com.mongodb.operation.CountOperation$1.call(CountOperation.java:210) 
at com.mongodb.operation.CountOperation$1.call(CountOperation.java:206) 
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230) 
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:203) 
at com.mongodb.operation.CountOperation.execute(CountOperation.java:206) 
at com.mongodb.operation.CountOperation.execute(CountOperation.java:53) 
at com.mongodb.Mongo.execute(Mongo.java:772) 
at com.mongodb.Mongo$2.execute(Mongo.java:759) 
at com.mongodb.DBCollection.getCount(DBCollection.java:962) 
at com.mongodb.DBCollection.getCount(DBCollection.java:937) 
at com.mongodb.DBCollection.getCount(DBCollection.java:931) 
at com.mongodb.DBCollection.getCount(DBCollection.java:914) 
at com.mongodb.DBCollection.getCount(DBCollection.java:885) 
at com.mongodb.DBCollection.count(DBCollection.java:824) 
at com.querydsl.mongodb.AbstractMongodbQuery.fetchCount(AbstractMongodbQuery.java:391) 
at com.querydsl.mongodb.AbstractMongodbQuery.fetchResults(AbstractMongodbQuery.java:376) 
at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.findAll(QueryDslMongoRepository.java:104) 
at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.findAll(QueryDslMongoRepository.java:50) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:503) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:488) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
at com.sun.proxy.$Proxy69.findAll(Unknown Source) 
at com.favendo.squirrel.persistence.CrudNutRepositoryTests.readTimeFrame(CrudNutRepositoryTests.java:83) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

據我所知,除了和編解碼器丟失,但不知道該做些什麼來解決這個問題。有人能幫助我嗎?

+0

我想你需要添加Java 8日期/時間(JSR-310)類型春數據MongoDB的支持。 – Hrabosch

+0

好的,謝謝你我會試試這個 – pDer666

+0

好吧,讓我知道它是否會起作用,我會從評論中創建答案。我想你可以從這些答案中獲得一些東西:http://stackoverflow.com/questions/22972679/spring-data-mongodb-with-java-8-localdate-mappingexception在這裏你可以找到靈感。我不認爲MongoDB支持新的Java 8類型:/ – Hrabosch

回答

1

我在我的應用程序中有類似的問題。

而不是使用ComparableExpression之間的,我用了Temporal expressions通過邏輯AND連接之前和後。

試試下面的(你可能想添加一些null檢查):

public static Predicate hasTimeBeetween(final ZonedDateTime from, final ZonedDateTime to) { 

     BooleanBuilder builder = new BooleanBuilder(); 
     builder.and(QMyDocument.myDocument.remoteTime.after(from)); 
     builder.and(QMyDocument.myDocument.remoteTime.before(to)); 

     return builder.getValue(); 
    } 
+0

該解決方法可行,但我不明白爲什麼。謝謝。 @Hrabosch我也會嘗試在你的評論中提到你的解決方案,並希望這將幫助我得到爲什麼我有這種例外。也謝謝你 – pDer666