使用JsonContentPolymorphicSerializer序列化时出现kotlin/uuid/Uuid类缺失错误
使用JsonContentPolymorphicSerializer序列化时抛出NoClassDefFoundError异常
我尝试用JsonContentPolymorphicSerializer动态反序列化JSON字段,反序列化功能正常,但将对象序列化为JSON时抛出以下异常:
java.lang.NoClassDefFoundError: kotlin/uuid/Uuid
复现代码
fun main() { println(Json.encodeToString(Company("Company 1", "basic"))) } object PlanSerializer2 : JsonContentPolymorphicSerializer<String>(String::class) { override fun selectDeserializer(element: JsonElement) = String.serializer() } @Serializable data class Company( val name: String, @Serializable(with = PlanSerializer2::class) val plan: String )
项目pom.xml配置
<properties> <ktor_version>2.3.12</ktor_version> <kotlin.code.style>official</kotlin.code.style> <kotlin_version>2.0.10</kotlin_version> <logback_version>1.4.14</logback_version> <slf4j_version>2.0.9</slf4j_version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kotlin.compiler.incremental>true</kotlin.compiler.incremental> <main.class>io.ktor.server.tomcat.EngineMain</main.class> <serialization.version>1.7.2</serialization.version> </properties> <packaging>war</packaging> <repositories> </repositories> <dependencies> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-ratelimiter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-core-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-tomcat-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-apache-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback_version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-config-yaml-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-content-negotiation-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-test-host-jvm</artifactId> <version>${ktor_version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test-junit</artifactId> <version>${kotlin_version}</version> <scope>test</scope> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-mock-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-debug</artifactId> <version>1.6.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-serialization-json</artifactId> <version>${serialization.version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-serialization-kotlinx-json-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-auth-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-content-negotiation-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-logging-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-double-receive-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-test</artifactId> <version>1.6.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-servlet-jakarta-jvm</artifactId> <version>${ktor_version}</version> </dependency> </dependencies> <build> <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory> <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <plugins> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>${kotlin_version}</version> <configuration> <compilerPlugins> <plugin>kotlinx-serialization</plugin> </compilerPlugins> </configuration> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-serialization</artifactId> <version>${kotlin_version}</version> </dependency> </dependencies> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>${main.class}</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>${main.class}</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> <configuration> <packagingExcludes>**/*.yaml,**/*.xml</packagingExcludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>21</source> <target>21</target> </configuration> <version>3.13.0</version> <executions> <execution> <id>default-compile</id> <phase>none</phase> </execution> <execution> <id>default-testCompile</id> <phase>none</phase> </execution> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>testCompile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
问题原因及解决方案
原因
JsonContentPolymorphicSerializer执行序列化逻辑时,依赖了kotlinx-uuid库中的kotlin.uuid.Uuid类,但你的pom.xml未引入该依赖,导致运行时找不到对应类。
解决方案
在pom.xml的<dependencies>节点中添加kotlinx-uuid-jvm依赖:
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-uuid-jvm</artifactId> <version>0.1.1</version> </dependency>
可根据项目使用的Kotlin版本选择匹配的最新版本(Kotlin 2.0.x兼容0.1.x及以上版本)。
另外,也可执行mvn dependency:tree命令查看项目依赖树,确认是否存在依赖冲突或版本不匹配的情况,确保所有序列化相关依赖版本兼容。
内容的提问来源于stack exchange,提问作者Sk1X1
相关产品推荐
相关产品推荐

