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

Spring+Ratpack集成Actuator遇阻:禁用WebMvc致Actuator失效

解决Ratpack集成Spring Boot时Actuator失效的问题

这个问题我之前踩过坑,核心原因是你设置了application.setWebEnvironment(false)——这会让Spring Boot直接禁用整个Web环境的自动配置,而Actuator的HTTP端点默认是依托Spring WebMvc/WebFlux的配置来暴露的,自然就跟着失效了。下面给你两个实用的解决思路:

思路1:调整Spring Boot配置,保留Actuator基础能力

不要直接关掉整个Web环境,而是排除Spring自带的WebMvc/WebFlux自动配置,让Spring Boot加载Actuator的相关Bean,再把Actuator端点映射到Ratpack路由上:

  1. 修改启动类,排除Web自动配置
@SpringBootApplication(exclude = {WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setBannerMode(Banner.Mode.OFF);
        // 移除setWebEnvironment(false),让Spring加载Actuator的Web相关Bean
        app.run(args);
    }
}
  1. 在Ratpack中集成Actuator端点
    注入Actuator的WebEndpointHandlerMapping,把/actuator开头的请求转发给Actuator处理:
@Bean
public RatpackServer ratpackServer(ApplicationContext context) {
    return RatpackServer.start(server -> server
            .registry(Registry.of(r -> r.add(context)))
            .handlers(chain -> {
                // 你的业务API路由
                chain.get("/api/test", ctx -> ctx.render("Hello from Ratpack API"));

                // 处理Actuator端点请求
                chain.path("/actuator", actuatorChain -> {
                    actuatorChain.all(ctx -> {
                        HttpServletRequest nativeReq = ctx.getRequest().getNativeRequest(HttpServletRequest.class);
                        HttpServletResponse nativeResp = ctx.getResponse().getNativeResponse(HttpServletResponse.class);
                        WebEndpointHandlerMapping handlerMapping = context.getBean(WebEndpointHandlerMapping.class);

                        try {
                            // 匹配Actuator的处理逻辑
                            Object handler = handlerMapping.getHandler(nativeReq);
                            if (handler != null) {
                                handlerMapping.getHandlerAdapter(handler).handle(nativeReq, nativeResp, handler);
                                ctx.response().status(nativeResp.getStatus()).send();
                            } else {
                                ctx.clientError(404);
                            }
                        } catch (Exception e) {
                            ctx.serverError(e);
                        }
                    });
                });
            })
    );
}

思路2:手动注册Actuator端点到Ratpack

如果不想依赖Spring的Web相关Bean,也可以手动获取Actuator的端点实例,直接在Ratpack中实现对应的路由,适合只需要少数核心端点的场景:

@Bean
public RatpackServer ratpackServer(HealthEndpoint healthEndpoint, InfoEndpoint infoEndpoint) {
    return RatpackServer.start(server -> server
            .handlers(chain -> {
                // 业务路由
                chain.get("/api/hello", ctx -> ctx.render("Hi there!"));

                // 手动映射health端点
                chain.get("/actuator/health", ctx -> {
                    Health health = healthEndpoint.health();
                    ctx.render(Jackson.json(health));
                });

                // 手动映射info端点
                chain.get("/actuator/info", ctx -> {
                    Map<String, Object> info = infoEndpoint.info();
                    ctx.render(Jackson.json(info));
                });

                // 其他端点可以按同样方式扩展
            })
    );
}

额外提醒

  • 确保项目中已经引入spring-boot-starter-actuator依赖
  • 如果需要暴露更多Actuator端点,记得在配置文件中开启:
    management.endpoints.web.exposure.include=*
    management.endpoint.health.show-details=always
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:22:04