You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Kotlin Spring项目遇No ServletContext set错误求助

问题分析与解决方案

核心原因

No ServletContext set异常本质是Spring应用初始化resourceHandlerMapping时,Web上下文(ServletContext)未就绪,或者应用被错误初始化为非Web类型。结合你本地启动正常、Docker容器内异常的场景,问题大概率出在Docker镜像构建/启动配置或容器内的Web环境初始化逻辑上。

具体排查与解决步骤

1. 核对Spring Boot启动类注解

确保启动类标注了正确的Web应用注解:

  • 必须使用@SpringBootApplication(它自带Web自动配置逻辑,会初始化ServletContext),如果是手动配置WebMvc,也要显式加@EnableWebMvc。
  • 绝对不能加@SpringBootApplication(exclude = {WebMvcAutoConfiguration.class})这类禁用Web自动配置的代码。

正确示例:

@SpringBootApplication
class YourPracticeApplication

fun main(args: Array<String>) {
    runApplication<YourPracticeApplication>(*args)
}

2. 检查Dockerfile的启动命令

容器内必须以Web应用方式启动,不能用非Web的启动逻辑(比如自定义CommandLineRunner跳过Web上下文),直接用Spring Boot默认启动命令:

ENTRYPOINT ["java", "-jar", "/your-app.jar"]

3. 修正application.properties的Web环境配置

确保没有禁用Web环境的配置,Servlet型Web应用要显式指定类型:

# 删掉类似禁用Web的配置:spring.main.web-application-type=NONE
# 显式指定为Servlet类型
spring.main.web-application-type=servlet

4. 核对项目依赖

确保build.gradle.kts(或pom.xml)中包含Web starter依赖,缺失依赖会导致Spring无法初始化ServletContext:

// build.gradle.kts示例
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    // 其他业务依赖...
}

5. 优化容器启动顺序(可选但稳妥)

虽然你说PostgreSQL正常启动,但可通过健康检查确保应用在数据库完全就绪后启动,避免因数据库连接异常间接导致上下文初始化失败:

services:
  app:
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:latest
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U your-db-user"]
      interval: 5s
      timeout: 5s
      retries: 5

验证流程

  1. 重新构建镜像:docker-compose build
  2. 启动容器:docker-compose up
  3. 若仍报错,查看容器完整日志定位更早的初始化错误:docker logs <你的应用容器ID>

内容的提问来源于stack exchange,提问作者Nikita Romanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:50:32