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

非Spring Boot项目集成Actuator健康端点遇ServletContext问题求助

解决非Spring Boot项目集成Spring Boot Actuator健康端点的ServletContext缺失问题

1. 调整项目依赖

Actuator的HTTP健康端点依赖Spring Web组件,同时需要嵌入式Tomcat作为Web容器。以Maven为例,在pom.xml中添加以下依赖:

<dependencies>
    <!-- Spring Boot Actuator 核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.7.15</version> <!-- 替换为你的Spring Boot兼容版本 -->
    </dependency>
    <!-- 嵌入式Tomcat依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>2.7.15</version>
    </dependency>
    <!-- Spring Web 依赖,提供Actuator端点的Web支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.15</version>
    </dependency>
</dependencies>

2. 配置Spring上下文与Actuator

创建配置类,导入Actuator健康端点的自动配置,同时绑定ServletContext到Spring上下文:

import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.context.support.GenericWebApplicationContext;

import javax.servlet.ServletContext;

@Configuration
@Import(HealthEndpointAutoConfiguration.class) // 导入健康端点的自动配置逻辑
public class ActuatorConfig {

    // 注册健康端点Bean
    @Bean
    public HealthEndpoint healthEndpoint(HealthIndicator healthIndicator) {
        return new HealthEndpoint(healthIndicator);
    }

    // 绑定ServletContext到Spring Web上下文
    @Bean
    public ServletContext servletContext(GenericWebApplicationContext context) {
        org.apache.catalina.core.ApplicationContextFacade servletContext =
                new org.apache.catalina.core.ApplicationContextFacade(context.getServletContext());
        context.setServletContext(servletContext);
        return servletContext;
    }
}

3. 手动启动Tomcat并关联Spring上下文

编写启动类,手动初始化Spring Web上下文,启动Tomcat并注册DispatcherServlet来处理Actuator请求:

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import java.io.File;

public class AppStarter {

    public static void main(String[] args) throws LifecycleException {
        // 初始化Tomcat实例
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);
        String tempDir = System.getProperty("java.io.tmpdir");
        tomcat.setBaseDir(tempDir);

        // 创建并刷新Spring Web上下文
        GenericWebApplicationContext springContext = new GenericWebApplicationContext();
        springContext.register(ActuatorConfig.class);
        springContext.refresh();

        // 配置Tomcat Web应用
        String contextPath = "/";
        File docBase = new File(tempDir);
        tomcat.addWebapp(contextPath, docBase.getAbsolutePath());

        // 注册DispatcherServlet,映射Actuator路径
        DispatcherServlet dispatcherServlet = new DispatcherServlet(springContext);
        Tomcat.addServlet(tomcat.getHost().findChild(contextPath), "actuatorDispatcher", dispatcherServlet);
        tomcat.getHost().findChild(contextPath).addServletMappingDecoded("/actuator/*", "actuatorDispatcher");

        // 启动Tomcat并保持运行
        tomcat.start();
        tomcat.getServer().await();
    }
}

4. 配置端点暴露规则

在项目根目录创建application.properties文件,配置健康端点的暴露权限:

# 暴露健康端点
management.endpoints.web.exposure.include=health
# 可选:显示详细健康信息(生产环境建议关闭)
management.endpoint.health.show-details=always

验证

启动AppStarter类后,访问http://localhost:8080/actuator/health,即可看到应用健康状态的JSON响应,示例如下:

{
  "status": "UP",
  "details": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 107374182400,
        "free": 53687091200,
        "threshold": 10485760
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:32