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

Spring Boot 2.7.17拆分WebMvc与Actuator上下文的配置求助

解决方案:拆分主应用与Actuator的Web上下文

针对你在Spring Boot 2.7.17中遇到的问题——主应用的WebMvcConfigurer被Actuator上下文继承导致响应格式异常,可以通过拆分主应用的WebMvc上下文与根上下文的方式彻底解决,同时保留Spring Boot的自动配置特性,无需使用@EnableWebMvc。

核心思路

让根上下文仅作为普通应用上下文(不包含WebMvc相关配置),主应用的WebMvc自动配置+自定义WebMvcConfigurer独立存放在子WebApplicationContext中,Actuator使用根上下文,从而避免继承主应用的WebMvc配置。

具体实现步骤

1. 调整根上下文配置,排除WebMvc自动配置

修改主启动类,排除WebMvcAutoConfiguration,让根上下文不加载WebMvc相关内容:

@SpringBootApplication(exclude = WebMvcAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. 创建主应用专用的WebMvc配置类

这个类负责导入Spring Boot的WebMvc自动配置,同时包含你的自定义WebMvcConfigurer逻辑,不要加@EnableWebMvc:

@Configuration
@Import(WebMvcAutoConfiguration.class) // 导入Spring Boot的WebMvc自动配置
public class MainWebMvcConfig implements WebMvcConfigurer {
    // 你的自定义WebMvc配置逻辑,比如消息转换器、视图解析等
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 示例:添加自定义消息转换器
        // converters.add(new MyCustomConverter());
    }
}

3. 配置主应用的DispatcherServlet与子上下文

创建配置类,初始化主应用的子WebApplicationContext,并绑定到DispatcherServlet:

@Configuration
public class DispatcherServletSetupConfig {

    // 创建主应用的子Web上下文,父上下文为根上下文
    @Bean
    public AnnotationConfigWebApplicationContext mainWebApplicationContext(ApplicationContext rootContext) {
        AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
        webContext.setParent(rootContext);
        webContext.register(MainWebMvcConfig.class); // 注册主应用的WebMvc配置
        return webContext;
    }

    // 实例化主应用的DispatcherServlet,使用子上下文
    @Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
    public DispatcherServlet mainDispatcherServlet(AnnotationConfigWebApplicationContext mainWebApplicationContext) {
        return new DispatcherServlet(mainWebApplicationContext);
    }

    // 注册DispatcherServlet到8080端口(默认端口),处理所有请求
    @Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
    public DispatcherServletRegistrationBean mainDispatcherServletRegistrationBean(DispatcherServlet mainDispatcherServlet) {
        DispatcherServletRegistrationBean registrationBean = new DispatcherServletRegistrationBean(mainDispatcherServlet, "/");
        registrationBean.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
        return registrationBean;
    }
}

4. 配置Actuator独立端口

在application.properties(或application.yml)中设置Actuator的独立端口及暴露规则:

# Actuator配置
management.server.port=8081
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

方案说明

  • 根上下文仅包含业务逻辑、数据源等非WebMvc配置,Actuator使用根上下文,因此不会继承主应用的WebMvcConfigurer,保持默认的响应格式,Spring Boot Admin可正常解析。
  • 主应用的子上下文通过@Import(WebMvcAutoConfiguration.class)保留了Spring Boot的WebMvc自动配置,同时加载自定义的WebMvcConfigurer,无需使用@EnableWebMvc(该注解会禁用自动配置,引发其他问题)。
  • 主应用的DispatcherServlet绑定到子上下文,处理8080端口的请求,完全独立于Actuator。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:34:55