未加@EnableWebMvc时v3/api-docs返回ASCII整数数组问题求助
问题原因分析
未添加@EnableWebMvc时,Spring Boot 2.7.x的WebMvc自动配置存在适配问题:默认消息转换器未正确处理OpenAPI端点返回的OpenAPI对象,也未注册对application/vnd.oas+json媒体类型的支持,导致响应被当作原始字节流处理,最终输出字节对应的ASCII整数数组。
添加@EnableWebMvc后,Spring会完全接管WebMvc配置,重新初始化包含正确JSON序列化逻辑的消息转换器,因此能正常返回JSON,但该注解会覆盖Spring Boot自动加载的Jackson配置(包括application.xml中的自定义设置)。
优雅解决方案
不需要添加@EnableWebMvc,通过以下几种方式修复:
方案1:扩展消息转换器并指定支持OpenAPI类型
创建WebMvcConfigurer实现类(无需@EnableWebMvc),扩展消息转换器列表,确保Jackson转换器优先处理OpenAPI响应:
@Configuration public class OpenApiConverterConfig implements WebMvcConfigurer { // 注入已通过application.xml配置好的ObjectMapper @Autowired private ObjectMapper customObjectMapper; @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper); // 添加OpenAPI专属媒体类型支持 jacksonConverter.getSupportedMediaTypes().add(new MediaType("application", "vnd.oas+json")); // 将转换器放到列表头部,优先处理 converters.add(0, jacksonConverter); } }
方案2:为OpenAPI单独注册消息转换器
直接为OpenAPI类型注册专属的HTTP消息转换器,不影响全局配置:
@Configuration public class OpenApiConfig { @Autowired private ObjectMapper customObjectMapper; @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info().title("REST API Docs").version("v1")); } @Bean public HttpMessageConverter<OpenAPI> openApiJsonConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(customObjectMapper); converter.setSupportedMediaTypes(Arrays.asList( MediaType.APPLICATION_JSON, new MediaType("application", "vnd.oas+json") )); return converter; } }
方案3:调整现有Jackson转换器的优先级
如果问题是因为String转换器优先处理了响应,可调整Jackson转换器的顺序:
@Configuration public class WebMvcPriorityConfig implements WebMvcConfigurer { @Autowired private MappingJackson2HttpMessageConverter defaultJacksonConverter; @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 移除原有Jackson转换器,再添加到列表头部 converters.remove(defaultJacksonConverter); converters.add(0, defaultJacksonConverter); } }
内容的提问来源于stack exchange,提问作者Hangjie Zheng
相关产品推荐
相关产品推荐

