From 6e150e32c540eb0ea775c31111656b5340c4be45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:34:12 +0000 Subject: [PATCH 1/3] Bump org.springframework.boot:spring-boot-dependencies Bumps [org.springframework.boot:spring-boot-dependencies](https://github.com/spring-projects/spring-boot) from 3.5.7 to 4.0.1. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.5.7...v4.0.1) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-dependencies dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bd741f5..f1f6e09 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ mockk = "1.14.7" msal4j = "1.23.1" sonarqube = "7.2.2.6593" spotless = "8.1.0" -springBoot = "3.5.8" +springBoot = "4.0.1" springmockk = "4.0.2" [libraries] From 0038db8d4e48604980526198a52158c102b8317a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 06:20:40 +0100 Subject: [PATCH 2/3] Bump com.ninja-squad:springmockk from 4.0.2 to 5.0.1 Bumps [com.ninja-squad:springmockk](https://github.com/Ninja-Squad/springmockk) from 4.0.2 to 5.0.1. - [Release notes](https://github.com/Ninja-Squad/springmockk/releases) - [Commits](https://github.com/Ninja-Squad/springmockk/compare/4.0.2...5.0.1) --- updated-dependencies: - dependency-name: com.ninja-squad:springmockk dependency-version: 5.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: Jasper Kamerling --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f1f6e09..b1db713 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ msal4j = "1.23.1" sonarqube = "7.2.2.6593" spotless = "8.1.0" springBoot = "4.0.1" -springmockk = "4.0.2" +springmockk = "5.0.1" [libraries] assertJ = { group = "org.assertj", name = "assertj-core" } From 0da3a1b9e33eb96d056ad80cc7ed91d223530d08 Mon Sep 17 00:00:00 2001 From: Jasper Kamerling Date: Fri, 16 Jan 2026 13:39:34 +0100 Subject: [PATCH 3/3] Spring Boot 4 migration Signed-off-by: Jasper Kamerling --- gradle/libs.versions.toml | 6 +++--- kafka-message-signing/build.gradle.kts | 7 +++---- .../kafka/message/IntegrationTestHelper.kt | 11 +++++------ .../kafka/message/MessageSigningInterceptorIT.kt | 2 +- .../kafka/message/signing/MessageSigner.kt | 16 ++++++++-------- .../MessageSigningAvroProducerInterceptor.kt | 2 +- ...MessageSigningByteArrayProducerInterceptor.kt | 2 +- ...MessageSigningInterceptorAutoConfiguration.kt | 9 ++++----- .../signing/DeprecatedMessageSignerTest.kt | 4 ++-- oauth-token-client/build.gradle.kts | 2 +- 10 files changed, 29 insertions(+), 32 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b1db713..3740e01 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,15 +28,15 @@ msal = { group = "com.microsoft.azure", name = "msal4j", version.ref = "msal4j" slf4jApi = { group = "org.slf4j", name = "slf4j-api" } kotlinReflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } kotlinLoggingJvm = { group = "io.github.oshai", name = "kotlin-logging-jvm", version.ref = "kotlinLogging" } -springBootAutoconfigure = { group = "org.springframework.boot", name = "spring-boot-autoconfigure" } +springBoot = { group = "org.springframework.boot", name = "spring-boot" } springBootConfigurationProcessor = { group = "org.springframework.boot", name = "spring-boot-configuration-processor" } springBootDependencies = { group = "org.springframework.boot", name = "spring-boot-dependencies", version.ref = "springBoot" } springBootStarter = { group = "org.springframework.boot", name = "spring-boot-starter" } springBootStarterTest = { group = "org.springframework.boot", name = "spring-boot-starter-test" } springBootTest = { group = "org.springframework.boot", name = "spring-boot-test" } springContext = { group = "org.springframework", name = "spring-context" } -springKafka = { group = "org.springframework.kafka", name = "spring-kafka" } -springKafkaTest = { group = "org.springframework.kafka", name = "spring-kafka-test" } +springBootKafka = { group = "org.springframework.boot", name = "spring-boot-starter-kafka" } +springBootKafkaTest = { group = "org.springframework.boot", name = "spring-boot-starter-kafka-test" } springmockk = { group = "com.ninja-squad", name = "springmockk", version.ref = "springmockk" } springTest = { group = "org.springframework", name = "spring-test" } diff --git a/kafka-message-signing/build.gradle.kts b/kafka-message-signing/build.gradle.kts index a3c4ce6..e36d14d 100644 --- a/kafka-message-signing/build.gradle.kts +++ b/kafka-message-signing/build.gradle.kts @@ -4,8 +4,7 @@ dependencies { implementation(libs.springContext) - implementation(libs.springKafka) - implementation(libs.springBootAutoconfigure) + implementation(libs.springBootKafka) implementation(libs.kotlinLoggingJvm) implementation(project(":kafka-avro")) @@ -37,8 +36,8 @@ testing { dependencies { implementation(project()) implementation(libs.springBootStarterTest) - implementation(libs.springKafka) - implementation(libs.springKafkaTest) + implementation(libs.springBootKafka) + implementation(libs.springBootKafkaTest) implementation(libs.kafkaClients) implementation(libs.assertJ) implementation(libs.avro) diff --git a/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/IntegrationTestHelper.kt b/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/IntegrationTestHelper.kt index 2131db8..3714105 100644 --- a/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/IntegrationTestHelper.kt +++ b/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/IntegrationTestHelper.kt @@ -27,7 +27,7 @@ object IntegrationTestHelper { ): Consumer { val consumerFactory = DefaultKafkaConsumerFactory( - KafkaTestUtils.consumerProps(UUID.randomUUID().toString(), "true", embeddedKafkaBroker), + KafkaTestUtils.consumerProps(embeddedKafkaBroker, UUID.randomUUID().toString(), true), StringDeserializer(), ByteArrayDeserializer(), ) @@ -52,7 +52,7 @@ object IntegrationTestHelper { ): Consumer { val consumerFactory = DefaultKafkaConsumerFactory( - KafkaTestUtils.consumerProps(UUID.randomUUID().toString(), "true", embeddedKafkaBroker), + KafkaTestUtils.consumerProps(embeddedKafkaBroker, UUID.randomUUID().toString(), true), StringDeserializer(), AvroDeserializer(listOf(Message.getClassSchema())), ) @@ -84,7 +84,8 @@ object IntegrationTestHelper { } class Message(private var message: String?) : SpecificRecordBase() { - constructor() : this(null) {} + @Suppress("unused") // Used reflectively by Spring Kafka + constructor() : this(null) companion object { fun getClassSchema(): Schema = @@ -96,9 +97,7 @@ class Message(private var message: String?) : SpecificRecordBase() { override fun getSchema() = getClassSchema() - override fun get(field: Int): Any { - return message!! - } + override fun get(field: Int): Any = message!! override fun put(field: Int, value: Any) { message = value.toString() diff --git a/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/MessageSigningInterceptorIT.kt b/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/MessageSigningInterceptorIT.kt index 0f24fde..430eca6 100644 --- a/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/MessageSigningInterceptorIT.kt +++ b/kafka-message-signing/src/integrationTest/kotlin/com/gxf/utilities/kafka/message/MessageSigningInterceptorIT.kt @@ -16,8 +16,8 @@ import org.apache.kafka.clients.producer.ProducerRecord import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.kafka.KafkaProperties import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration +import org.springframework.boot.kafka.autoconfigure.KafkaProperties import org.springframework.boot.test.context.SpringBootTest import org.springframework.kafka.test.EmbeddedKafkaBroker import org.springframework.kafka.test.context.EmbeddedKafka diff --git a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/MessageSigner.kt b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/MessageSigner.kt index 0cec190..4c2f101 100644 --- a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/MessageSigner.kt +++ b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/MessageSigner.kt @@ -226,14 +226,14 @@ class MessageSigner(properties: MessageSigningProperties) { */ fun verifyUsingField(message: FlexibleSignableMessageWrapper, key: PublicKey? = verificationKey): Boolean { if (!canVerifyMessageSignatures(key)) { - logger.error(KEY_NOT_FOR_VERIFICATION) + logger.error { KEY_NOT_FOR_VERIFICATION } return false } val messageSignature = message.getSignature() if (messageSignature == null) { - logger.error("This message does not contain a signature") + logger.error { "This message does not contain a signature" } return false } @@ -241,7 +241,7 @@ class MessageSigner(properties: MessageSigningProperties) { message.clearSignature() return verifySignatureBytes(messageSignature, toByteBuffer(message), key!!) } catch (e: Exception) { - logger.error(UNABLE_TO_VERIFY_SIGNATURE, e) + logger.error(e) { UNABLE_TO_VERIFY_SIGNATURE } return false } finally { message.setSignature(messageSignature) @@ -267,7 +267,7 @@ class MessageSigner(properties: MessageSigningProperties) { key: PublicKey? = verificationKey, ): Boolean { if (!canVerifyMessageSignatures(key)) { - logger.error(KEY_NOT_FOR_VERIFICATION) + logger.error { KEY_NOT_FOR_VERIFICATION } return false } try { @@ -275,7 +275,7 @@ class MessageSigner(properties: MessageSigningProperties) { val specificRecordBase: SpecificRecordBase = consumerRecord.value() return verifySignatureBytes(ByteBuffer.wrap(signatureBytes), toByteBuffer(specificRecordBase), key!!) } catch (e: Exception) { - logger.error(UNABLE_TO_VERIFY_SIGNATURE, e) + logger.error(e) { UNABLE_TO_VERIFY_SIGNATURE } return false } } @@ -300,13 +300,13 @@ class MessageSigner(properties: MessageSigningProperties) { ): Boolean { try { if (!canVerifyMessageSignatures(key)) { - logger.error(KEY_NOT_FOR_VERIFICATION) + logger.error { KEY_NOT_FOR_VERIFICATION } return false } val signatureBytes = getSignatureBytes(consumerRecord) return verifySignatureBytes(ByteBuffer.wrap(signatureBytes), ByteBuffer.wrap(consumerRecord.value()), key!!) } catch (e: Exception) { - logger.error(UNABLE_TO_VERIFY_SIGNATURE, e) + logger.error(e) { UNABLE_TO_VERIFY_SIGNATURE } return false } } @@ -453,7 +453,7 @@ class MessageSigner(properties: MessageSigningProperties) { } try { val content = privateKeyFile.getContentAsString(StandardCharsets.ISO_8859_1) - return PemContent.of(content).privateKey + return PemContent.of(content)?.privateKey } catch (e: IOException) { logger.error(e) { "Unable to read ${privateKeyFile.filename} as ISO-LATIN-1 PEM text" } throw UncheckedIOException(e) diff --git a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningAvroProducerInterceptor.kt b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningAvroProducerInterceptor.kt index 118d4fd..53b7249 100644 --- a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningAvroProducerInterceptor.kt +++ b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningAvroProducerInterceptor.kt @@ -9,7 +9,7 @@ import org.apache.kafka.clients.producer.ProducerInterceptor import org.apache.kafka.clients.producer.ProducerRecord import org.apache.kafka.clients.producer.RecordMetadata -class MessageSigningAvroProducerInterceptor() : ProducerInterceptor { +class MessageSigningAvroProducerInterceptor : ProducerInterceptor { private lateinit var messageSigner: MessageSigner override fun onSend( diff --git a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningByteArrayProducerInterceptor.kt b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningByteArrayProducerInterceptor.kt index 6f0f303..67d7f3f 100644 --- a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningByteArrayProducerInterceptor.kt +++ b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningByteArrayProducerInterceptor.kt @@ -8,7 +8,7 @@ import org.apache.kafka.clients.producer.ProducerInterceptor import org.apache.kafka.clients.producer.ProducerRecord import org.apache.kafka.clients.producer.RecordMetadata -class MessageSigningByteArrayProducerInterceptor() : ProducerInterceptor { +class MessageSigningByteArrayProducerInterceptor : ProducerInterceptor { private lateinit var messageSigner: MessageSigner override fun onSend(producerRecord: ProducerRecord): ProducerRecord = diff --git a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningInterceptorAutoConfiguration.kt b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningInterceptorAutoConfiguration.kt index 848944a..5b2c664 100644 --- a/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningInterceptorAutoConfiguration.kt +++ b/kafka-message-signing/src/main/kotlin/com/gxf/utilities/kafka/message/signing/interceptors/MessageSigningInterceptorAutoConfiguration.kt @@ -6,20 +6,19 @@ package com.gxf.utilities.kafka.message.signing.interceptors import com.gxf.utilities.kafka.message.signing.MessageSigner import org.apache.kafka.clients.producer.ProducerConfig import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty -import org.springframework.boot.autoconfigure.kafka.KafkaProperties -import org.springframework.boot.ssl.SslBundles +import org.springframework.boot.kafka.autoconfigure.KafkaProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @ConditionalOnProperty(value = ["message-signing.use-interceptor"], havingValue = "true", matchIfMissing = false) @Configuration -class MessageSigningInterceptorAutoConfiguration(private val sslBundles: SslBundles) { +class MessageSigningInterceptorAutoConfiguration { @Bean fun producerPropertiesForByteArrayRecords( kafkaProperties: KafkaProperties, messageSigner: MessageSigner, ): Map { - val properties = kafkaProperties.buildProducerProperties(sslBundles) + val properties = kafkaProperties.buildProducerProperties() properties[ProducerConfig.INTERCEPTOR_CLASSES_CONFIG] = listOf(MessageSigningByteArrayProducerInterceptor::class.java) properties["message.signer"] = messageSigner @@ -31,7 +30,7 @@ class MessageSigningInterceptorAutoConfiguration(private val sslBundles: SslBund kafkaProperties: KafkaProperties, messageSigner: MessageSigner, ): Map { - val properties = kafkaProperties.buildProducerProperties(sslBundles) + val properties = kafkaProperties.buildProducerProperties() properties[ProducerConfig.INTERCEPTOR_CLASSES_CONFIG] = listOf(MessageSigningAvroProducerInterceptor::class.java) properties["message.signer"] = messageSigner diff --git a/kafka-message-signing/src/test/kotlin/com/gxf/utilities/kafka/message/signing/DeprecatedMessageSignerTest.kt b/kafka-message-signing/src/test/kotlin/com/gxf/utilities/kafka/message/signing/DeprecatedMessageSignerTest.kt index f2ec2ea..7bb68c5 100644 --- a/kafka-message-signing/src/test/kotlin/com/gxf/utilities/kafka/message/signing/DeprecatedMessageSignerTest.kt +++ b/kafka-message-signing/src/test/kotlin/com/gxf/utilities/kafka/message/signing/DeprecatedMessageSignerTest.kt @@ -106,8 +106,8 @@ class DeprecatedMessageSignerTest { return signature } - override fun setSignature(newSignature: ByteBuffer?) { - signature = newSignature + override fun setSignature(signature: ByteBuffer?) { + this.signature = signature } } } diff --git a/oauth-token-client/build.gradle.kts b/oauth-token-client/build.gradle.kts index b514b4c..d5cc9a1 100644 --- a/oauth-token-client/build.gradle.kts +++ b/oauth-token-client/build.gradle.kts @@ -1,5 +1,5 @@ dependencies{ - implementation(libs.springBootAutoconfigure) + implementation(libs.springBoot) implementation(libs.kotlinReflect) implementation(libs.msal)