From 3e74049fe95d4007ebc9f0a38c8e2085c6893b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sun, 8 Mar 2026 20:19:57 +0100 Subject: [PATCH] fix(bson): Fix ClassNotFoundException when :bson-kotlinx is not in the classpath --- bson/src/jvmMain/kotlin/types/Instant.jvm.kt | 3 --- .../kotlin/types/IsBsonKotlinXPresent.kt | 24 +++++++++++++++++++ bson/src/jvmMain/kotlin/types/ObjectId.jvm.kt | 3 --- .../src/jvmMain/kotlin/types/Timestamp.jvm.kt | 3 --- bson/src/jvmMain/kotlin/types/Uuid.jvm.kt | 3 --- bson/src/jvmMain/kotlin/types/Vector.jvm.kt | 3 --- 6 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 bson/src/jvmMain/kotlin/types/IsBsonKotlinXPresent.kt diff --git a/bson/src/jvmMain/kotlin/types/Instant.jvm.kt b/bson/src/jvmMain/kotlin/types/Instant.jvm.kt index 1e79eea2..61cdf513 100644 --- a/bson/src/jvmMain/kotlin/types/Instant.jvm.kt +++ b/bson/src/jvmMain/kotlin/types/Instant.jvm.kt @@ -24,9 +24,6 @@ import org.bson.codecs.kotlinx.BsonDecoder import org.bson.codecs.kotlinx.BsonEncoder import kotlin.time.Instant -private val isOfficialKotlinSerializationEnabled = - ClassLoader.getSystemClassLoader().loadClass("org.bson.codecs.kotlinx.BsonEncoder") != null - @OptIn(ExperimentalSerializationApi::class) internal actual fun serializeInstantPlatformSpecific(encoder: Encoder, value: Instant) { if (isOfficialKotlinSerializationEnabled && encoder is BsonEncoder) { diff --git a/bson/src/jvmMain/kotlin/types/IsBsonKotlinXPresent.kt b/bson/src/jvmMain/kotlin/types/IsBsonKotlinXPresent.kt new file mode 100644 index 00000000..32ace96a --- /dev/null +++ b/bson/src/jvmMain/kotlin/types/IsBsonKotlinXPresent.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2026, OpenSavvy and contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package opensavvy.ktmongo.bson.types + +internal val isOfficialKotlinSerializationEnabled: Boolean = try { + Class.forName("org.bson.codecs.kotlinx.BsonEncoder") + true +} catch (_: ClassNotFoundException) { + false +} diff --git a/bson/src/jvmMain/kotlin/types/ObjectId.jvm.kt b/bson/src/jvmMain/kotlin/types/ObjectId.jvm.kt index e9856d75..c7a7d14c 100644 --- a/bson/src/jvmMain/kotlin/types/ObjectId.jvm.kt +++ b/bson/src/jvmMain/kotlin/types/ObjectId.jvm.kt @@ -22,9 +22,6 @@ import kotlinx.serialization.encoding.Encoder import org.bson.codecs.kotlinx.BsonDecoder import org.bson.codecs.kotlinx.BsonEncoder -private val isOfficialKotlinSerializationEnabled = - ClassLoader.getSystemClassLoader().loadClass("org.bson.codecs.kotlinx.BsonEncoder") != null - @OptIn(ExperimentalSerializationApi::class) internal actual fun serializeObjectIdPlatformSpecific(encoder: Encoder, value: ObjectId) { if (isOfficialKotlinSerializationEnabled && encoder is BsonEncoder) { diff --git a/bson/src/jvmMain/kotlin/types/Timestamp.jvm.kt b/bson/src/jvmMain/kotlin/types/Timestamp.jvm.kt index 2e16da02..7841dc83 100644 --- a/bson/src/jvmMain/kotlin/types/Timestamp.jvm.kt +++ b/bson/src/jvmMain/kotlin/types/Timestamp.jvm.kt @@ -25,9 +25,6 @@ import org.bson.codecs.kotlinx.BsonEncoder import kotlin.time.ExperimentalTime import kotlin.time.Instant -private val isOfficialKotlinSerializationEnabled = - ClassLoader.getSystemClassLoader().loadClass("org.bson.codecs.kotlinx.BsonEncoder") != null - @OptIn(ExperimentalTime::class, ExperimentalSerializationApi::class) internal actual fun serializeTimestampPlatformSpecific(encoder: Encoder, value: Timestamp) { if (isOfficialKotlinSerializationEnabled && encoder is BsonEncoder) { diff --git a/bson/src/jvmMain/kotlin/types/Uuid.jvm.kt b/bson/src/jvmMain/kotlin/types/Uuid.jvm.kt index bc39e79a..abc3b0c3 100644 --- a/bson/src/jvmMain/kotlin/types/Uuid.jvm.kt +++ b/bson/src/jvmMain/kotlin/types/Uuid.jvm.kt @@ -27,9 +27,6 @@ import kotlin.uuid.Uuid import kotlin.uuid.toJavaUuid import kotlin.uuid.toKotlinUuid -private val isOfficialKotlinSerializationEnabled = - ClassLoader.getSystemClassLoader().loadClass("org.bson.codecs.kotlinx.BsonEncoder") != null - @OptIn(ExperimentalUuidApi::class, ExperimentalSerializationApi::class) internal actual fun serializeUuidPlatformSpecific(encoder: Encoder, value: Uuid) { if (isOfficialKotlinSerializationEnabled && encoder is BsonEncoder) { diff --git a/bson/src/jvmMain/kotlin/types/Vector.jvm.kt b/bson/src/jvmMain/kotlin/types/Vector.jvm.kt index 69312fba..80c50e7e 100644 --- a/bson/src/jvmMain/kotlin/types/Vector.jvm.kt +++ b/bson/src/jvmMain/kotlin/types/Vector.jvm.kt @@ -24,9 +24,6 @@ import org.bson.BsonBinarySubType import org.bson.codecs.kotlinx.BsonDecoder import org.bson.codecs.kotlinx.BsonEncoder -private val isOfficialKotlinSerializationEnabled = - ClassLoader.getSystemClassLoader().loadClass("org.bson.codecs.kotlinx.BsonEncoder") != null - @OptIn(ExperimentalSerializationApi::class, LowLevelApi::class) internal actual fun serializeVectorPlatformSpecific(encoder: Encoder, value: Vector) { if (isOfficialKotlinSerializationEnabled && encoder is BsonEncoder) { -- 2.51.2