非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
相关产品推荐
相关产品推荐

