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

