From 53855df24aedb1479196229494671110f2911670 Mon Sep 17 00:00:00 2001 From: server_main Date: Mon, 17 Aug 2026 12:45:36 +0000 Subject: [PATCH] fix: about kotlinx.serialize --- src/backend/build.gradle.kts | 3 +- .../itmanager/config/SerializationConfig.kt | 2 ++ .../itmanager/entity/dto/FinanceRecord.kt | 3 +- .../itstudio/itmanager/entity/dto/Item.kt | 3 +- .../itmanager/utils/BigDecimalSerializer.kt | 35 +++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/backend/src/main/kotlin/club/itstudio/itmanager/utils/BigDecimalSerializer.kt diff --git a/src/backend/build.gradle.kts b/src/backend/build.gradle.kts index 7ab44b1..a3e273f 100644 --- a/src/backend/build.gradle.kts +++ b/src/backend/build.gradle.kts @@ -1,12 +1,13 @@ plugins { kotlin("jvm") version "2.3.21" kotlin("plugin.spring") version "2.3.21" + id("org.jetbrains.kotlin.plugin.serialization") version "2.4.20-RC" id("org.springframework.boot") version "4.1.0" id("io.spring.dependency-management") version "1.1.7" } group = "club.itstudio" -version = "0.1.0" +version = "0.1.1" description = "itmanager" java { diff --git a/src/backend/src/main/kotlin/club/itstudio/itmanager/config/SerializationConfig.kt b/src/backend/src/main/kotlin/club/itstudio/itmanager/config/SerializationConfig.kt index a5852e4..bd3a8cc 100644 --- a/src/backend/src/main/kotlin/club/itstudio/itmanager/config/SerializationConfig.kt +++ b/src/backend/src/main/kotlin/club/itstudio/itmanager/config/SerializationConfig.kt @@ -1,5 +1,6 @@ package club.itstudio.itmanager.config +import club.itstudio.itmanager.utils.customSerializersModule import kotlinx.serialization.json.Json import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -9,6 +10,7 @@ class SerializationConfig { @Bean fun kotlinxSerializationJson(): Json = Json { + serializersModule = customSerializersModule ignoreUnknownKeys = true isLenient = true encodeDefaults = false diff --git a/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/FinanceRecord.kt b/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/FinanceRecord.kt index 28d9524..15e5314 100644 --- a/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/FinanceRecord.kt +++ b/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/FinanceRecord.kt @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName import club.itstudio.itmanager.entity.DataCopy import club.itstudio.itmanager.entity.enums.FinanceRecordType import kotlinx.datetime.LocalDateTime +import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.math.BigDecimal @@ -17,7 +18,7 @@ data class FinanceRecord( val recordNo: String? = null, val type: FinanceRecordType = FinanceRecordType.OTHER, val relatedItemId: Long? = null, - val amount: BigDecimal = BigDecimal.ZERO, + val amount: @Contextual BigDecimal = BigDecimal.ZERO, val currency: String = "CNY", val vendor: String? = null, val occurredAt: LocalDateTime? = null, diff --git a/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/Item.kt b/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/Item.kt index 87dd562..9c17305 100644 --- a/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/Item.kt +++ b/src/backend/src/main/kotlin/club/itstudio/itmanager/entity/dto/Item.kt @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName import club.itstudio.itmanager.entity.DataCopy import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDateTime +import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import java.math.BigDecimal @@ -23,7 +24,7 @@ data class Item( val totalQuantity: Int = 0, val availableQuantity: Int = 0, val unit: String = "件", - val price: BigDecimal? = null, + val price: @Contextual BigDecimal? = null, val purchaseDate: LocalDate? = null, val supplier: String? = null, val status: String = "normal", diff --git a/src/backend/src/main/kotlin/club/itstudio/itmanager/utils/BigDecimalSerializer.kt b/src/backend/src/main/kotlin/club/itstudio/itmanager/utils/BigDecimalSerializer.kt new file mode 100644 index 0000000..ab3c152 --- /dev/null +++ b/src/backend/src/main/kotlin/club/itstudio/itmanager/utils/BigDecimalSerializer.kt @@ -0,0 +1,35 @@ +package club.itstudio.itmanager.utils + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerializationException +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual +import java.math.BigDecimal + +object BigDecimalSerializer : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("BigDecimal", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: BigDecimal) { + encoder.encodeString(value.toPlainString()) + } + + override fun deserialize(decoder: Decoder): BigDecimal { + val element = (decoder as JsonDecoder).decodeJsonElement() + if (element !is JsonPrimitive) { + throw SerializationException("Expected JSON primitive, got $element") + } + return element.content.toBigDecimal() + } +} + +val customSerializersModule = SerializersModule { + contextual(BigDecimalSerializer) +} \ No newline at end of file