Java Driver: Migrating From 4.11 to 5.0
Rate this article
The MongoDB Java driver 5.0.0 is now available!
While this version doesn't include many new features, it's removing a lot of deprecated methods and is preparing for the
future.
- Compile against the 4.11 version of the driver with deprecation warnings enabled.
- Remove deprecated classes and methods.
1 <dependency> 2 <groupId>org.mongodb</groupId> 3 <artifactId>mongodb-driver-sync</artifactId> 4 <version>5.0.0</version> 5 </dependency>
1 implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: '5.0.0'
The behavior of the method
getElapsedTime()
was modified in the following classes:1 com.mongodb.event.ConnectionReadyEvent 2 com.mongodb.event.ConnectionCheckedOutFailedEvent 3 com.mongodb.event.ConnectionCheckedOutEvent
5.0.0 adds support for the
authorizedCollection
option of the listCollections
command.The
org.mongodb.scala.Observable.completeWithUnit()
method is now marked deprecated.One of the best ways to identify if your code will require any changes following the upgrade to Java Driver 5.0 is to compile against 4.11.0 with deprecation warnings enabled and remove the use of any deprecated methods and classes.
The following methods and classes have been removed in 5.0.0:
streamFactoryFactory()
method fromMongoClientSettings.Builder
getStreamFactoryFactory()
method fromMongoClientSettings
NettyStreamFactoryFactory
classNettyStreamFactory
classAsynchronousSocketChannelStreamFactory
classAsynchronousSocketChannelStreamFactoryFactory
classBufferProvider
classSocketStreamFactory
classStream
classStreamFactory
classStreamFactoryFactory
classTlsChannelStreamFactoryFactory
class
If you configure Netty using the
streamFactoryFactory()
, your code is probably like this:1 import com.mongodb.connection.netty.NettyStreamFactoryFactory; 2 // ... 3 MongoClientSettings settings = MongoClientSettings.builder() 4 .streamFactoryFactory(NettyStreamFactoryFactory.builder().build()) 5 .build();
Now, you should use the
TransportSettings.nettyBuilder()
:1 import com.mongodb.connection.TransportSettings; 2 // ... 3 MongoClientSettings settings = MongoClientSettings.builder() 4 .transportSettings(TransportSettings.nettyBuilder().build()) 5 .build();
In 4.11, the class
ConnectionId
was using integers.1 2 public final class ConnectionId { 3 private static final AtomicInteger INCREMENTING_ID = new AtomicInteger(); 4 5 private final ServerId serverId; 6 private final int localValue; 7 private final Integer serverValue; 8 private final String stringValue; 9 // ... 10 }
1 2 public final class ConnectionId { 3 private static final AtomicLong INCREMENTING_ID = new AtomicLong(); 4 private final ServerId serverId; 5 private final long localValue; 6 7 private final Long serverValue; 8 private final String stringValue; 9 // ... 10 }
While this should have a very minor impact on your code, it's breaking binary and source compatibility. Make sure to
rebuild your binary and you should be good to go.
Three record annotations moved from:
1 org.bson.codecs.record.annotations.BsonId 2 org.bson.codecs.record.annotations.BsonProperty 3 org.bson.codecs.record.annotations.BsonRepresentation
To:
1 org.bson.codecs.pojo.annotations.BsonId 2 org.bson.codecs.pojo.annotations.BsonProperty 3 org.bson.codecs.pojo.annotations.BsonRepresentation
So if you are using these annotations, please make sure to update the imports and rebuild.
The first parameters of the two following builder methods in
SocketSettings
are now using a long instead of an
integer.1 public Builder connectTimeout(final long connectTimeout, final TimeUnit timeUnit) {/*...*/} 2 public Builder readTimeout(final long readTimeout, final TimeUnit timeUnit){/*...*/}
This breaks binary compatibility but shouldn't require a code change in your code.
Filters.eqFull()
was only released in Beta
for vector search. It's now deprecated. Use Filters.eq()
instead when
instantiating a VectorSearchOptions
.1 VectorSearchOptions opts = vectorSearchOptions().filter(eq("x", 8));
The way the driver is computing the
ClusterConnectionMode
is now more consistent by using a specified replica set
name, regardless of how it's configured.In the following example, both the 4.11 and 5.0.0 drivers were returning the same
thing:
ClusterConnectionMode.MULTIPLE
.1 ClusterSettings.builder() 2 .applyConnectionString(new ConnectionString("mongodb://127.0.0.1:27017/?replicaSet=replset")) 3 .build() 4 .getMode();
But in this example, the 4.11 driver was returning
ClusterConnectionMode.SINGLE
instead
of ClusterConnectionMode.MULTIPLE
.1 ClusterSettings.builder() 2 .hosts(Collections.singletonList(new ServerAddress("127.0.0.1", 27017))) 3 .requiredReplicaSetName("replset") 4 .build() 5 .getMode();
The behaviour of
BsonDecimal128
is now more consistent with the behaviour of Decimal128
.1 BsonDecimal128.isNumber(); // returns true 2 BsonDecimal128.asNumber(); // returns the BsonNumber
With the release of MongoDB Java Driver 5.0.0, it's evident that the focus has been on refining existing functionalities, removing deprecated methods, and ensuring compatibility for future enhancements. While the changes may necessitate some adjustments in your codebase, they pave the way for a more robust and efficient development experience.
Ready to upgrade? Dive into the latest version of the MongoDB Java drivers and start leveraging its enhanced capabilities today!
To finish with, don't forget to enable virtual threads in your Spring Boot 3.2.0+ projects! You just need to add this in your
application.properties
file:1 spring.threads.virtual.enabled=true
Got questions or itching to share your success? Head over to the MongoDB Community Forum – we're all ears and ready to help!
Top Comments in Forums
There are no comments on this article yet.