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

Spring MVC集成SpringDoc遇序列化异常问题求助

解决Spring MVC 5.3.23 + SpringDoc 1.8 下 /v3/api-docs 重复序列化问题

针对你遇到的/v3/api-docs接口重复序列化、Swagger UI页面异常的问题,可按以下步骤排查修复:

1. 调整消息转换器优先级,避免二次序列化

非Spring Boot环境下,SpringDoc的OpenApiResource返回的JSON会被Spring MVC默认消息转换器二次处理,导致出现引号包裹或BASE64编码问题。需将SpringDoc专属的消息转换器优先级设为最高:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springdoc.core.converters.SpringDocMessageConverter;

import java.util.List;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public SpringDocMessageConverter springDocMessageConverter() {
        return new SpringDocMessageConverter();
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 将SpringDoc转换器放在首位,避免被其他转换器二次序列化
        converters.add(0, springDocMessageConverter());
        // 保留原有Jackson转换器处理自定义接口
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

2. 排除SpringDoc与项目的Jackson依赖冲突

检查你的依赖配置,确保SpringDoc自带的Jackson版本与项目依赖版本一致,避免因版本差异导致序列化异常。如果使用Maven,可添加依赖排除:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-webmvc-core</artifactId>
    <version>1.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 简化OpenApiConfig配置,避免自定义序列化干扰

确保你的OpenApiConfig仅负责OpenAPI元信息配置,不要手动绑定自定义ObjectMapper,防止与SpringDoc内部序列化逻辑冲突:

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("业务API文档")
                        .version("1.0")
                        .description("系统核心接口描述"));
    }
}

4. 验证DispatcherServlet配置的正确性

确保DispatcherServlet加载了SpringDoc相关配置类,避免配置遗漏:

public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{OpenApiConfig.class, WebMvcConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

5. 调试消息转换器执行流程

可在WebMvcConfig中添加日志,确认SpringDoc转换器优先执行:

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    for (HttpMessageConverter<?> converter : converters) {
        System.out.println("Loaded converter: " + converter.getClass().getName());
    }
}

启动项目后访问/v3/api-docs,查看控制台输出,确认SpringDocMessageConverter是第一个被执行的转换器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:50:06