[JAVA-3332] NullPointerException when using a update document of type BasicDBObject and POJO codec Created: 23/Jun/19  Updated: 28/Oct/23  Resolved: 24/Jun/19

Status: Closed
Project: Java Driver
Component/s: BSON, Codecs, Write Operations
Affects Version/s: 3.10.2
Fix Version/s: 3.11.0

Type: Bug Priority: Major - P3
Reporter: Raghu c Assignee: Ross Lawley
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
is duplicated by JAVA-3157 Coverity analysis defect 105261: Expl... Closed

 Description   

When trying to update with a update document defined using a BasicDBObject and the update document has custom POJOs as part of its update definition the operation fails with the exception,

Exception in thread "main" java.lang.NullPointerException
 at org.bson.codecs.pojo.PojoCodecImpl.encodeValue(PojoCodecImpl.java:180)
 at org.bson.codecs.pojo.PojoCodecImpl.encodeProperty(PojoCodecImpl.java:168)
 at org.bson.codecs.pojo.PojoCodecImpl.encode(PojoCodecImpl.java:105)
 at org.bson.codecs.pojo.AutomaticPojoCodec.encode(AutomaticPojoCodec.java:50)
 at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:231)
 at com.mongodb.DBObjectCodec.encodeIterable(DBObjectCodec.java:291)
 at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:218)
 at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:240)
 at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:216)
 at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:148)
 at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:64)
 at org.bson.BsonDocumentWrapper.getUnwrapped(BsonDocumentWrapper.java:195)
 at org.bson.BsonDocumentWrapper.isEmpty(BsonDocumentWrapper.java:115)
 at com.mongodb.operation.BulkWriteBatch$WriteRequestEncoder.encode(BulkWriteBatch.java:395)
 at com.mongodb.operation.BulkWriteBatch$WriteRequestEncoder.encode(BulkWriteBatch.java:377)
 at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
 at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
 at com.mongodb.internal.connection.BsonWriterHelper.writeDocument(BsonWriterHelper.java:75)
 at com.mongodb.internal.connection.BsonWriterHelper.writePayload(BsonWriterHelper.java:59)
 at com.mongodb.internal.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:145)
 at com.mongodb.internal.connection.RequestMessage.encode(RequestMessage.java:138)
 at com.mongodb.internal.connection.CommandMessage.encode(CommandMessage.java:59)
 at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:244)
 at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99)
 at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:444)
 at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:72)
 at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:200)
 at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:269)
 at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:131)
 at com.mongodb.operation.MixedBulkWriteOperation.executeCommand(MixedBulkWriteOperation.java:433)
 at com.mongodb.operation.MixedBulkWriteOperation.executeBulkWriteBatch(MixedBulkWriteOperation.java:259)
 at com.mongodb.operation.MixedBulkWriteOperation.access$700(MixedBulkWriteOperation.java:70)
 at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:203)
 at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:194)
 at com.mongodb.operation.OperationHelper.withReleasableConnection(OperationHelper.java:424)
 at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:194)
 at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:69)
 at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:193)
 at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:961)
 at com.mongodb.client.internal.MongoCollectionImpl.executeUpdate(MongoCollectionImpl.java:952)
 at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:614)
 at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:609)
 at com.github.raghuchandrasekaran.app.ItemListDaoImpl.updateItems(ItemListDaoImpl.java:33)
 at com.github.raghuchandrasekaran.app.Application.main(Application.java:47)

This is a small sample which can be used to reproduce the issue,

 

BasicDBObject itemsUpdateDoc = new BasicDBObject();
 itemsUpdateDoc.put("items", <list of custom POJOs>);
getCollection().updateOne(Filters.eq(<id>), new BasicDBObject("$addToSet", itemsUpdateDoc));

The same problem will not occur when using the Updates builder or using a Document instead of BasicDBObject.

The issue occurs because a null reference of EncoderContext is passed in the methods encodeMap and encodeIterable in DBObjectCodec. Also in the previous versions the PojoCodecImpl's encodeProperty did not make use of the passed encoderContext and was using the property model's cached codec to encode.

propertyModel.getCachedCodec().encode

This issue is also fixed in 3.11.0-beta4 as part of #JAVA-3157
 



 Comments   
Comment by Raghu c [ 01/Jan/20 ]

Hi Ross,

Wish you a happy new year.

Sorry for the delayed response. I have updated the version to 3.11.0 and that resolved the issue.

Thanks for the support.

Comment by Ross Lawley [ 25/Jun/19 ]

Hi raghu.9208,

There are no current plans to backport. Especially, as using Document rather than BasicDBObject works.
Is this bug causing you significant issues?

Ross

Comment by Raghu c [ 25/Jun/19 ]

Hi Ross,

Are there any plans to port the fix #JAVA-3157 to 3.10.3?--

Comment by Ross Lawley [ 24/Jun/19 ]

Hi raghu.9208,

Many thanks for the ticket and the write-up showing the real world implications of JAVA-3157. As you noted this issue has already been fixed and is in the latest beta.

Ross

Generated at Thu Feb 08 08:59:21 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.