Skip to content

MongoClientVersion uses a non-reliable way to fetch db driver version. #4937

Closed
@smagellan

Description

@smagellan

Hello.

MongoClientVersion does its best to determine mongodb driver version properly and use a proper driver API.
But looks like com.mongodb.internal.build.MongoDriverVersion.VERSION value is inlined and always 5.2.1 (for spring-data-mongodb 4.4.4), note LDC "5.2.1":

Bytecode
private static getVersionFromPackage(Ljava/lang/ClassLoader;)Lorg/springframework/data/util/Version;
    // parameter  classLoader
  @Lorg/springframework/lang/Nullable;()
    TRYCATCHBLOCK L0 L1 L2 java/lang/IllegalArgumentException
   L3
    LINENUMBER 97 L3
    LDC "com.mongodb.internal.build.MongoDriverVersion"
    ALOAD 0
    INVOKESTATIC org/springframework/util/ClassUtils.isPresent (Ljava/lang/String;Ljava/lang/ClassLoader;)Z
    IFEQ L4
   L0
    LINENUMBER 99 L0
    LDC "5.2.1"
    INVOKESTATIC org/springframework/data/util/Version.parse (Ljava/lang/String;)Lorg/springframework/data/util/Version;
   L1
    ARETURN
   L2
    LINENUMBER 100 L2
   FRAME SAME1 java/lang/IllegalArgumentException
    ASTORE 1
   L4
    LINENUMBER 104 L4
   FRAME SAME
    ACONST_NULL
    ARETURN
   L5
    LOCALVARIABLE classLoader Ljava/lang/ClassLoader; L3 L5 0
    MAXSTACK = 2
    MAXLOCALS = 2
This will not work properly if one e.g. excludes driver 5.X version and provides 4.X explicitly instead, see stacktrace:
Stacktrace
Exception in thread "main" java.lang.ExceptionInInitializerError
	at org.springframework.data.mongodb.core.MongoTemplate.lambda$getCollectionNames$29(MongoTemplate.java:2353)
	at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:582)
	at org.springframework.data.mongodb.core.MongoTemplate.getCollectionNames(MongoTemplate.java:2351)
	at smagellan.test.mongodb.SpringDataMongodbRunner.main(SpringDataMongodbRunner.java:15)
Caused by: java.lang.IllegalStateException: Unable to load com.mongodb.client.ListCollectionNamesIterable
	at org.springframework.data.mongodb.util.MongoCompatibilityAdapter$MongoDatabaseAdapter.<clinit>(MongoCompatibilityAdapter.java:228)
	... 4 more
Caused by: java.lang.ClassNotFoundException: com.mongodb.client.ListCollectionNamesIterable
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:534)
	at java.base/java.lang.Class.forName(Class.java:513)
	at org.springframework.util.ClassUtils.forName(ClassUtils.java:299)
	at org.springframework.data.mongodb.util.MongoCompatibilityAdapter$MongoDatabaseAdapter.<clinit>(MongoCompatibilityAdapter.java:225)
	... 4 more

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions