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

未加@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:22:56