使用Maven+Tomcat的Ktor项目Kotlinx.serialization无响应体问题
Ktor 3.0.2 + Maven + Tomcat 组合下请求返回200但无响应体问题
问题描述
通过start.ktor.io创建Ktor 3.0.2项目,配置详情:
- 构建系统:Maven
- 引擎:Tomcat
- 配置方式:代码式配置
- 集成插件:Content Negotiation、Routing、Kotlinx.serialization、Static Content
- 包含示例代码
将项目导入IntelliJ运行后,向http://localhost:8080或http://localhost:8080/json/kotlinx-serialization发送GET请求,返回状态码200但无响应体,Postman测试结果一致。切换为Gradle构建或Netty引擎后功能正常,当前使用JDK 17。
复现步骤
- 按上述配置在start.ktor.io创建新项目
- 导入IntelliJ并启动服务
- 访问
http://localhost:8080即可复现问题
最小复现代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>ktor-sample23</artifactId> <version>0.0.1</version> <name>ktor-sample23</name> <description>ktor-sample23</description> <properties> <kotlin.code.style>official</kotlin.code.style> <kotlin_version>2.1.0</kotlin_version> <ktor_version>3.0.2</ktor_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>com.example.ApplicationKt</main.class> </properties> <repositories> </repositories> <dependencies> <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-core-jvm</artifactId> <version>${ktor_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-server-host-common-jvm</artifactId> <version>${ktor_version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-tomcat-jakarta-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-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>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-debug</artifactId> <version>1.6.4</version> <scope>test</scope> </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> <jvmTarget>1.8</jvmTarget> </configuration> <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> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin_version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> <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> </plugin> </plugins> </build> </project>
Application.kt
package com.example import io.ktor.server.application.* import io.ktor.server.engine.* import io.ktor.server.tomcat.jakarta.* fun main() { embeddedServer(Tomcat, port = 8080, host = "0.0.0.0", module = Application::module) .start(wait = true) } fun Application.module() { configureSerialization() configureRouting() }
Routing.kt
package com.example import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* import io.ktor.server.http.content.* import io.ktor.server.plugins.contentnegotiation.* import io.ktor.server.response.* import io.ktor.server.routing.* fun Application.configureRouting() { routing { get("/") { call.respondText("Hello World!") } // Static plugin. Try to access `/static/index.html` staticResources("/static", "static") } }
Serialization.kt
package com.example import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* import io.ktor.server.http.content.* import io.ktor.server.plugins.contentnegotiation.* import io.ktor.server.response.* import io.ktor.server.routing.* fun Application.configureSerialization() { install(ContentNegotiation) { json() } routing { get("/json/kotlinx-serialization") { call.respond(mapOf("hello" to "world")) } } }
内容的提问来源于stack exchange,提问作者Rudhra Koul
相关产品推荐
相关产品推荐

