mirror of
https://github.com/Dannecron/spring-boot-demo.git
synced 2025-12-26 00:32:34 +03:00
use kotlinx.serialization instead of ObjectMapper in kafka producer
This commit is contained in:
@@ -2,7 +2,6 @@ package com.example.demo.config
|
|||||||
|
|
||||||
import com.example.demo.services.kafka.Producer
|
import com.example.demo.services.kafka.Producer
|
||||||
import com.example.demo.services.kafka.ProducerImpl
|
import com.example.demo.services.kafka.ProducerImpl
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
|
||||||
import org.apache.kafka.clients.producer.ProducerConfig
|
import org.apache.kafka.clients.producer.ProducerConfig
|
||||||
import org.apache.kafka.common.serialization.StringSerializer
|
import org.apache.kafka.common.serialization.StringSerializer
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
@@ -37,9 +36,7 @@ class KafkaProducerConfig(
|
|||||||
@Bean
|
@Bean
|
||||||
fun producer(
|
fun producer(
|
||||||
@Autowired kafkaTemplate: KafkaTemplate<String, Any>,
|
@Autowired kafkaTemplate: KafkaTemplate<String, Any>,
|
||||||
@Autowired objectMapper: ObjectMapper
|
|
||||||
): Producer = ProducerImpl(
|
): Producer = ProducerImpl(
|
||||||
kafkaTemplate,
|
kafkaTemplate,
|
||||||
objectMapper,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.example.demo.models
|
package com.example.demo.models
|
||||||
|
|
||||||
import com.example.demo.models.serializables.OffsetDateTimeSerialization
|
import com.example.demo.services.serializables.OffsetDateTimeSerialization
|
||||||
import com.example.demo.models.serializables.UuidSerialization
|
import com.example.demo.services.serializables.UuidSerialization
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.springframework.data.annotation.Id
|
import org.springframework.data.annotation.Id
|
||||||
import org.springframework.data.relational.core.mapping.Column
|
import org.springframework.data.relational.core.mapping.Column
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.example.demo.models
|
package com.example.demo.models
|
||||||
|
|
||||||
|
|
||||||
import com.example.demo.models.serializables.OffsetDateTimeSerialization
|
import com.example.demo.services.serializables.OffsetDateTimeSerialization
|
||||||
import com.example.demo.models.serializables.UuidSerialization
|
import com.example.demo.services.serializables.UuidSerialization
|
||||||
import com.example.demo.utils.roundTo
|
import com.example.demo.utils.roundTo
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.springframework.data.annotation.Id
|
import org.springframework.data.annotation.Id
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ package com.example.demo.services.kafka
|
|||||||
|
|
||||||
import com.example.demo.models.Product
|
import com.example.demo.models.Product
|
||||||
import com.example.demo.services.kafka.dto.ProductDto
|
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.core.KafkaTemplate
|
||||||
import org.springframework.kafka.support.KafkaHeaders
|
import org.springframework.kafka.support.KafkaHeaders
|
||||||
import org.springframework.messaging.Message
|
import org.springframework.messaging.Message
|
||||||
@@ -12,11 +13,12 @@ import org.springframework.stereotype.Service
|
|||||||
@Service
|
@Service
|
||||||
class ProducerImpl(
|
class ProducerImpl(
|
||||||
private val kafkaTemplate: KafkaTemplate<String, Any>,
|
private val kafkaTemplate: KafkaTemplate<String, Any>,
|
||||||
private val objectMapper: ObjectMapper
|
|
||||||
): Producer {
|
): Producer {
|
||||||
override fun produceProductInfo(topicName: String, product: Product) {
|
override fun produceProductInfo(topicName: String, product: Product) {
|
||||||
|
|
||||||
|
val serializedProduct = Json.encodeToJsonElement(ProductDto(product))
|
||||||
val message: Message<String> = MessageBuilder
|
val message: Message<String> = MessageBuilder
|
||||||
.withPayload(objectMapper.writeValueAsString(ProductDto(product)))
|
.withPayload(serializedProduct.toString())
|
||||||
.setHeader(KafkaHeaders.TOPIC, topicName)
|
.setHeader(KafkaHeaders.TOPIC, topicName)
|
||||||
.setHeader("X-Custom-Header", "some-custom-header")
|
.setHeader("X-Custom-Header", "some-custom-header")
|
||||||
.build()
|
.build()
|
||||||
|
|||||||
@@ -2,25 +2,18 @@ package com.example.demo.services.kafka.dto
|
|||||||
|
|
||||||
import com.example.demo.models.Product
|
import com.example.demo.models.Product
|
||||||
import com.example.demo.services.kafka.exceptions.InvalidArgumentException
|
import com.example.demo.services.kafka.exceptions.InvalidArgumentException
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import kotlinx.serialization.Serializable
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
@Serializable
|
||||||
data class ProductDto(
|
data class ProductDto(
|
||||||
@JsonProperty("id")
|
|
||||||
val id: Long,
|
val id: Long,
|
||||||
@JsonProperty("guid")
|
|
||||||
val guid: String,
|
val guid: String,
|
||||||
@JsonProperty("name")
|
|
||||||
val name: String,
|
val name: String,
|
||||||
@JsonProperty("description")
|
|
||||||
val description: String?,
|
val description: String?,
|
||||||
@JsonProperty("price")
|
|
||||||
val price: Long,
|
val price: Long,
|
||||||
@JsonProperty("createdAt")
|
|
||||||
val createdAt: String,
|
val createdAt: String,
|
||||||
@JsonProperty("updatedAt")
|
|
||||||
val updatedAt: String?,
|
val updatedAt: String?,
|
||||||
@JsonProperty("deletedAt")
|
|
||||||
val deletedAt: String?,
|
val deletedAt: String?,
|
||||||
) {
|
) {
|
||||||
@Throws(InvalidArgumentException::class)
|
@Throws(InvalidArgumentException::class)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.demo.models.serializables
|
package com.example.demo.services.serializables
|
||||||
|
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.descriptors.PrimitiveKind
|
import kotlinx.serialization.descriptors.PrimitiveKind
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.example.demo.models.serializables
|
package com.example.demo.services.serializables
|
||||||
|
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.descriptors.PrimitiveKind
|
import kotlinx.serialization.descriptors.PrimitiveKind
|
||||||
@@ -3,7 +3,7 @@ package com.example.demo.services.kafka
|
|||||||
import com.example.demo.BaseUnitTest
|
import com.example.demo.BaseUnitTest
|
||||||
import com.example.demo.models.Product
|
import com.example.demo.models.Product
|
||||||
import com.example.demo.services.kafka.dto.ProductDto
|
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.junit.runner.RunWith
|
||||||
import org.mockito.kotlin.argumentCaptor
|
import org.mockito.kotlin.argumentCaptor
|
||||||
import org.mockito.kotlin.doReturn
|
import org.mockito.kotlin.doReturn
|
||||||
@@ -28,9 +28,6 @@ class ProducerImplTest: BaseUnitTest() {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private lateinit var producerImpl: ProducerImpl
|
private lateinit var producerImpl: ProducerImpl
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private lateinit var objectMapper: ObjectMapper
|
|
||||||
|
|
||||||
@MockBean
|
@MockBean
|
||||||
private lateinit var kafkaTemplate: KafkaTemplate<String, Any>
|
private lateinit var kafkaTemplate: KafkaTemplate<String, Any>
|
||||||
|
|
||||||
@@ -58,7 +55,7 @@ class ProducerImplTest: BaseUnitTest() {
|
|||||||
assertEquals(1, captor.allValues.count())
|
assertEquals(1, captor.allValues.count())
|
||||||
val actualArgument = captor.firstValue
|
val actualArgument = captor.firstValue
|
||||||
|
|
||||||
val actualProductDto = objectMapper.readValue(actualArgument.payload, ProductDto::class.java)
|
val actualProductDto = Json.decodeFromString<ProductDto>(actualArgument.payload)
|
||||||
assertEquals(product.id, actualProductDto.id)
|
assertEquals(product.id, actualProductDto.id)
|
||||||
assertEquals(product.guid.toString(), actualProductDto.guid)
|
assertEquals(product.guid.toString(), actualProductDto.guid)
|
||||||
assertEquals(topic, actualArgument.headers[KafkaHeaders.TOPIC])
|
assertEquals(topic, actualArgument.headers[KafkaHeaders.TOPIC])
|
||||||
|
|||||||
Reference in New Issue
Block a user