diff --git a/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt b/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt index bdae971..43470ca 100644 --- a/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt +++ b/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt @@ -2,7 +2,6 @@ package com.example.demo.config import com.example.demo.services.kafka.Producer import com.example.demo.services.kafka.ProducerImpl -import com.fasterxml.jackson.databind.ObjectMapper import org.apache.kafka.clients.producer.ProducerConfig import org.apache.kafka.common.serialization.StringSerializer import org.springframework.beans.factory.annotation.Autowired @@ -37,9 +36,7 @@ class KafkaProducerConfig( @Bean fun producer( @Autowired kafkaTemplate: KafkaTemplate, - @Autowired objectMapper: ObjectMapper ): Producer = ProducerImpl( kafkaTemplate, - objectMapper, ) } \ No newline at end of file diff --git a/src/main/kotlin/com/example/demo/models/City.kt b/src/main/kotlin/com/example/demo/models/City.kt index bacd05b..aa7b355 100644 --- a/src/main/kotlin/com/example/demo/models/City.kt +++ b/src/main/kotlin/com/example/demo/models/City.kt @@ -1,7 +1,7 @@ package com.example.demo.models -import com.example.demo.models.serializables.OffsetDateTimeSerialization -import com.example.demo.models.serializables.UuidSerialization +import com.example.demo.services.serializables.OffsetDateTimeSerialization +import com.example.demo.services.serializables.UuidSerialization import kotlinx.serialization.Serializable import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Column diff --git a/src/main/kotlin/com/example/demo/models/Product.kt b/src/main/kotlin/com/example/demo/models/Product.kt index 5fe138e..42bfeee 100644 --- a/src/main/kotlin/com/example/demo/models/Product.kt +++ b/src/main/kotlin/com/example/demo/models/Product.kt @@ -1,8 +1,8 @@ package com.example.demo.models -import com.example.demo.models.serializables.OffsetDateTimeSerialization -import com.example.demo.models.serializables.UuidSerialization +import com.example.demo.services.serializables.OffsetDateTimeSerialization +import com.example.demo.services.serializables.UuidSerialization import com.example.demo.utils.roundTo import kotlinx.serialization.Serializable import org.springframework.data.annotation.Id diff --git a/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt b/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt index 19aa17b..3544640 100644 --- a/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt +++ b/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt @@ -2,7 +2,8 @@ package com.example.demo.services.kafka import com.example.demo.models.Product import com.example.demo.services.kafka.dto.ProductDto -import com.fasterxml.jackson.databind.ObjectMapper +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.encodeToJsonElement import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.support.KafkaHeaders import org.springframework.messaging.Message @@ -12,11 +13,12 @@ import org.springframework.stereotype.Service @Service class ProducerImpl( private val kafkaTemplate: KafkaTemplate, - private val objectMapper: ObjectMapper ): Producer { override fun produceProductInfo(topicName: String, product: Product) { + + val serializedProduct = Json.encodeToJsonElement(ProductDto(product)) val message: Message = MessageBuilder - .withPayload(objectMapper.writeValueAsString(ProductDto(product))) + .withPayload(serializedProduct.toString()) .setHeader(KafkaHeaders.TOPIC, topicName) .setHeader("X-Custom-Header", "some-custom-header") .build() diff --git a/src/main/kotlin/com/example/demo/services/kafka/dto/ProductDto.kt b/src/main/kotlin/com/example/demo/services/kafka/dto/ProductDto.kt index d45197b..ff7a133 100644 --- a/src/main/kotlin/com/example/demo/services/kafka/dto/ProductDto.kt +++ b/src/main/kotlin/com/example/demo/services/kafka/dto/ProductDto.kt @@ -2,25 +2,18 @@ package com.example.demo.services.kafka.dto import com.example.demo.models.Product import com.example.demo.services.kafka.exceptions.InvalidArgumentException -import com.fasterxml.jackson.annotation.JsonProperty +import kotlinx.serialization.Serializable import java.time.format.DateTimeFormatter +@Serializable data class ProductDto( - @JsonProperty("id") val id: Long, - @JsonProperty("guid") val guid: String, - @JsonProperty("name") val name: String, - @JsonProperty("description") val description: String?, - @JsonProperty("price") val price: Long, - @JsonProperty("createdAt") val createdAt: String, - @JsonProperty("updatedAt") val updatedAt: String?, - @JsonProperty("deletedAt") val deletedAt: String?, ) { @Throws(InvalidArgumentException::class) diff --git a/src/main/kotlin/com/example/demo/models/serializables/OffsetDateTimeSerialization.kt b/src/main/kotlin/com/example/demo/services/serializables/OffsetDateTimeSerialization.kt similarity index 94% rename from src/main/kotlin/com/example/demo/models/serializables/OffsetDateTimeSerialization.kt rename to src/main/kotlin/com/example/demo/services/serializables/OffsetDateTimeSerialization.kt index b7d8b4a..9838dbc 100644 --- a/src/main/kotlin/com/example/demo/models/serializables/OffsetDateTimeSerialization.kt +++ b/src/main/kotlin/com/example/demo/services/serializables/OffsetDateTimeSerialization.kt @@ -1,4 +1,4 @@ -package com.example.demo.models.serializables +package com.example.demo.services.serializables import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/src/main/kotlin/com/example/demo/models/serializables/UuidSerialization.kt b/src/main/kotlin/com/example/demo/services/serializables/UuidSerialization.kt similarity index 93% rename from src/main/kotlin/com/example/demo/models/serializables/UuidSerialization.kt rename to src/main/kotlin/com/example/demo/services/serializables/UuidSerialization.kt index 17e7c36..99d7e07 100644 --- a/src/main/kotlin/com/example/demo/models/serializables/UuidSerialization.kt +++ b/src/main/kotlin/com/example/demo/services/serializables/UuidSerialization.kt @@ -1,4 +1,4 @@ -package com.example.demo.models.serializables +package com.example.demo.services.serializables import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/src/test/kotlin/com/example/demo/services/kafka/ProducerImplTest.kt b/src/test/kotlin/com/example/demo/services/kafka/ProducerImplTest.kt index 6d9e73d..1220737 100644 --- a/src/test/kotlin/com/example/demo/services/kafka/ProducerImplTest.kt +++ b/src/test/kotlin/com/example/demo/services/kafka/ProducerImplTest.kt @@ -3,7 +3,7 @@ package com.example.demo.services.kafka import com.example.demo.BaseUnitTest import com.example.demo.models.Product import com.example.demo.services.kafka.dto.ProductDto -import com.fasterxml.jackson.databind.ObjectMapper +import kotlinx.serialization.json.Json import org.junit.runner.RunWith import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn @@ -28,9 +28,6 @@ class ProducerImplTest: BaseUnitTest() { @Autowired private lateinit var producerImpl: ProducerImpl - @Autowired - private lateinit var objectMapper: ObjectMapper - @MockBean private lateinit var kafkaTemplate: KafkaTemplate @@ -58,7 +55,7 @@ class ProducerImplTest: BaseUnitTest() { assertEquals(1, captor.allValues.count()) val actualArgument = captor.firstValue - val actualProductDto = objectMapper.readValue(actualArgument.payload, ProductDto::class.java) + val actualProductDto = Json.decodeFromString(actualArgument.payload) assertEquals(product.id, actualProductDto.id) assertEquals(product.guid.toString(), actualProductDto.guid) assertEquals(topic, actualArgument.headers[KafkaHeaders.TOPIC])