Hello,
Spring Boot 2.0.0.M4 mongodb-driver-reactivestreams 1.6.0
I'm facing a bug that appear when I save an entity with @DbRef
Look this test :
@Test
public void testMongoDbRef() {
AccountEntity account = AccountBuilder.createDefaultAccountEntity();
accountRepository.save(account).subscribe(accountEntity -> System.out.println(account.getId()));
CustomerEntity customer = CustomerBuilder.createCustomerEntity();
customer.setAccount(account);
customerRepository.save(customer).subscribe(customerEntity -> System.out.println(customerEntity.getId()));
}
@DBRef
@Field(CustomerDef.ACCOUNT)
private AccountEntity account;
and the result is :
2017-09-19 13:08:09,042 WARN main client.warn - Callback onResult call produced an error
reactor.core.Exceptions$ErrorCallbackNotImplemented: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.mongodb.DBRef.
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.mongodb.DBRef.
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.ChildCodecRegistry.get(ChildCodecRegistry.java:51)
at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:174)
at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:189)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:131)
at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
at com.mongodb.connection.InsertCommandMessage.writeTheWrites(InsertCommandMessage.java:101)
at com.mongodb.connection.InsertCommandMessage.writeTheWrites(InsertCommandMessage.java:43)
at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129)
at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
at com.mongodb.connection.WriteCommandProtocol.executeBatchesAsync(WriteCommandProtocol.java:150)
at com.mongodb.connection.WriteCommandProtocol.executeAsync(WriteCommandProtocol.java:137)
at com.mongodb.connection.InsertCommandProtocol.executeAsync(InsertCommandProtocol.java:80)
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.executeAsync(DefaultServer.java:179)
at com.mongodb.connection.DefaultServerConnection.executeProtocolAsync(DefaultServerConnection.java:295)
at com.mongodb.connection.DefaultServerConnection.insertCommandAsync(DefaultServerConnection.java:131)
at com.mongodb.operation.MixedBulkWriteOperation$Run$5.executeWriteCommandProtocolAsync(MixedBulkWriteOperation.java:533)
at com.mongodb.operation.MixedBulkWriteOperation$Run$AsyncRunExecutor.executeAsync(MixedBulkWriteOperation.java:703)
at com.mongodb.operation.MixedBulkWriteOperation$Run.executeAsync(MixedBulkWriteOperation.java:425)
at com.mongodb.operation.MixedBulkWriteOperation.executeRunsAsync(MixedBulkWriteOperation.java:230)
at com.mongodb.operation.MixedBulkWriteOperation.access$600(MixedBulkWriteOperation.java:74)
at com.mongodb.operation.MixedBulkWriteOperation$2$1.call(MixedBulkWriteOperation.java:212)
at com.mongodb.operation.OperationHelper$3.call(OperationHelper.java:185)
at com.mongodb.operation.OperationHelper.validateCollationAndWriteConcern(OperationHelper.java:140)
at com.mongodb.operation.OperationHelper.validateWriteRequestCollations(OperationHelper.java:182)
at com.mongodb.operation.OperationHelper$4.call(OperationHelper.java:205)
at com.mongodb.operation.OperationHelper.checkBypassDocumentValidationIsSupported(OperationHelper.java:288)
at com.mongodb.operation.OperationHelper.validateWriteRequests(OperationHelper.java:199)
at com.mongodb.operation.MixedBulkWriteOperation$2.call(MixedBulkWriteOperation.java:204)
at com.mongodb.operation.OperationHelper$8.onResult(OperationHelper.java:476)
at com.mongodb.operation.OperationHelper$8.onResult(OperationHelper.java:469)
at com.mongodb.connection.DefaultServer$1.onResult(DefaultServer.java:105)
at com.mongodb.connection.DefaultServer$1.onResult(DefaultServer.java:96)
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
at com.mongodb.connection.DefaultConnectionPool.openAsync(DefaultConnectionPool.java:188)
at com.mongodb.connection.DefaultConnectionPool.getAsync(DefaultConnectionPool.java:145)
at com.mongodb.connection.DefaultServer.getConnectionAsync(DefaultServer.java:96)
at com.mongodb.binding.AsyncClusterBinding$AsyncClusterBindingConnectionSource.getConnection(AsyncClusterBinding.java:102)
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:469)
at com.mongodb.operation.OperationHelper.access$000(OperationHelper.java:58)
at com.mongodb.operation.OperationHelper$AsyncCallableWithConnectionCallback.onResult(OperationHelper.java:463)
at com.mongodb.operation.OperationHelper$AsyncCallableWithConnectionCallback.onResult(OperationHelper.java:453)
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
at com.mongodb.binding.AsyncClusterBinding$1.onResult(AsyncClusterBinding.java:81)
at com.mongodb.binding.AsyncClusterBinding$1.onResult(AsyncClusterBinding.java:75)
at com.mongodb.connection.BaseCluster$ServerSelectionRequest.onResult(BaseCluster.java:409)
at com.mongodb.connection.BaseCluster.handleServerSelectionRequest(BaseCluster.java:280)
at com.mongodb.connection.BaseCluster.selectServerAsync(BaseCluster.java:141)
at com.mongodb.binding.AsyncClusterBinding.getAsyncClusterBindingConnectionSource(AsyncClusterBinding.java:75)
at com.mongodb.binding.AsyncClusterBinding.getWriteConnectionSource(AsyncClusterBinding.java:70)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:442)
at com.mongodb.operation.MixedBulkWriteOperation.executeAsync(MixedBulkWriteOperation.java:195)
at com.mongodb.async.client.MongoClientImpl$2.execute(MongoClientImpl.java:140)
at com.mongodb.async.client.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:623)
at com.mongodb.async.client.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:327)
at com.mongodb.reactivestreams.client.internal.MongoCollectionImpl$3.apply(MongoCollectionImpl.java:222)
at com.mongodb.reactivestreams.client.internal.MongoCollectionImpl$3.apply(MongoCollectionImpl.java:219)
at com.mongodb.async.client.SingleResultCallbackSubscription.requestInitialData(SingleResultCallbackSubscription.java:39)
at com.mongodb.async.client.AbstractSubscription.tryRequestInitialData(AbstractSubscription.java:151)
at com.mongodb.async.client.AbstractSubscription.request(AbstractSubscription.java:82)
at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1$1.request(ObservableToPublisher.java:50)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1439)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:67)
at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1.onSubscribe(ObservableToPublisher.java:39)
at com.mongodb.async.client.SingleResultCallbackSubscription.<init>(SingleResultCallbackSubscription.java:34)
at com.mongodb.async.client.Observables$2.subscribe(Observables.java:76)
at com.mongodb.reactivestreams.client.internal.ObservableToPublisher.subscribe(ObservableToPublisher.java:36)
at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:169)
at reactor.core.publisher.MonoFlatMapMany.subscribe(MonoFlatMapMany.java:46)
at reactor.core.publisher.FluxOnErrorResume.subscribe(FluxOnErrorResume.java:46)
at reactor.core.publisher.MonoTakeLastOne.subscribe(MonoTakeLastOne.java:48)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.Mono.subscribe(Mono.java:2757)
at reactor.core.publisher.Mono.subscribeWith(Mono.java:2878)
at reactor.core.publisher.Mono.subscribe(Mono.java:2751)
at reactor.core.publisher.Mono.subscribe(Mono.java:2718)
at reactor.core.publisher.Mono.subscribe(Mono.java:2665)
at fr.app.helios.service.SalesforceIncomingServiceTest.testMongoDbRef(SalesforceIncomingServiceTest.java:73)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
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.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
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:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
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:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
2017-09-19 13:08:09,049 INFO Thread-16 GenericWebApplicationContext.doClose - Closing org.springframework.web.context.support.GenericWebApplicationContext@2e3a5237: startup date [Tue Sep 19 15:08:03 CEST 2017]; root of context hierarchy
2017-09-19 13:08:09,058 INFO Thread-16 connection.info - Closed connection [connectionId{localValue:4, serverValue:85}] to localhost:27017 because the pool has been closed.
2017-09-19 13:08:09,061 INFO Thread-16 connection.info - Closed connection [connectionId{localValue:3, serverValue:84}] to localhost:27017 because the pool has been closed.
Is there a solution or it's bug ?
Thanks
Comment From: wilkinsona
Is there a solution or it's bug ?
It's impossible to tell from what you've provided thus far. Can you please provide a complete, minimal example that we can unzip or git clone that reproduces the problem?
Comment From: mmaryo
@wilkinsona spring-boot-2-mongo-dbref-example.zip
Comment From: wilkinsona
You are using a mixture of Mongo Driver 3.4.3 and 3.5.0. You should override the version properties rather than individual dependencies:
<properties>
<mongo-driver-reactivestreams.version>1.6.0</mongo-driver-reactivestreams.version>
<mongodb.version>3.5.0</mongodb.version>
</properties>
Comment From: mmaryo
I see that :
Caused by: java.lang.ClassNotFoundException: com.mongodb.reactivestreams.client.MongoClient
It's the same for you @wilkinsona ?
Comment From: wilkinsona
No, your test passes for me with the change I described above.
Comment From: mmaryo
It's strange
I use mongo v3.4.3
Have you an idea for resolve this issue ?
Caused by: java.lang.TypeNotPresentException: Type com.mongodb.reactivestreams.client.MongoClient not present
Caused by: java.lang.ClassNotFoundException: com.mongodb.reactivestreams.client.MongoClient
Comment From: Hasnaa-Ibraheem
To be specific, as this may save the day for any other developers.. This error: CodecConfigurationException: Can't find a codec for class xxx means that your mongo driver is not able to handle/parse the data you sent in the object you made of that xxx class and accordingly can't generate the mongo query you want. The resolution in that case would be either to use the right class (in my case replacing java array by ArrayList resolved the issue).. The other resolution could be to upgrade your driver. This depends on your exact case. hth