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

Springfox 3.0.0升级后作为@RequestBody的接口Schema为空问题求助

解决Springfox 3.0.0中带@JsonDeserialize的接口Schema为空的问题

我之前也碰到过一模一样的问题,Springfox 3.0.0对接口类型的Schema生成逻辑和2.x版本差异很大——尤其是处理带有@JsonDeserialize注解的接口时,默认不会自动关联到指定的实现类去解析属性,这就是为什么你的StringInterface生成的Schema是空的。

下面是两种经过验证的可行解决方案:

方案一:自定义ModelBuilderPlugin强制解析实现类属性

创建一个自定义插件,让Springfox在处理接口类型时,优先读取@JsonDeserialize指定的实现类来生成Schema:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.v3.core.converter.ModelConverter;
import io.swagger.v3.core.converter.ModelConverterContext;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.core.model.Model;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Type;
import java.util.Iterator;

@Configuration
public class CustomSwaggerModelConfig {

    @Bean
    public ModelResolver customModelResolver() {
        return new ModelResolver(null) {
            @Override
            public Model resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) {
                if (type instanceof Class<?>) {
                    Class<?> clazz = (Class<?>) type;
                    // 检查当前类是否是接口且带有@JsonDeserialize注解
                    if (clazz.isInterface()) {
                        JsonDeserialize deserializeAnn = clazz.getAnnotation(JsonDeserialize.class);
                        if (deserializeAnn != null && deserializeAnn.as() != Void.class) {
                            // 用指定的实现类替换接口来解析Schema
                            return super.resolve(deserializeAnn.as(), context, chain);
                        }
                    }
                }
                return super.resolve(type, context, chain);
            }
        };
    }
}

方案二:调整Docket配置,添加类型映射规则

在你的SwaggerConfig中,通过additionalModels把接口类型直接映射到对应的实现类Schema:

import io.swagger.v3.core.converter.ModelConverters;
import io.swagger.v3.oas.models.media.Schema;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
@EnableOpenApi
public class SwaggerConfig {

    @Bean
    Docket api() {
        // 预先解析实现类的Schema结构
        Schema<?> clazzSchema = ModelConverters.getInstance().readAllAsResolvedSchema(Clazz.class).schema;
        
        return new Docket(DocumentationType.OAS_30)
                .select()
                .apis(RequestHandlerSelectors.basePackage("org.springframework.boot").negate())
                .build()
                // 将接口类型的Schema替换为实现类的Schema
                .additionalModels(typeResolver -> typeResolver.resolve(StringInterface.class)
                        .schema(clazzSchema));
    }
}

原理说明

Springfox 3.0.0切换到了OpenAPI 3.0规范,内部的ModelResolver默认只会处理具体类的属性;对于接口类型,除非显式指定,否则不会自动扫描@JsonDeserialize注解来关联实现类。上面两种方案都是通过干预Springfox的模型解析流程,让它能够识别接口对应的实现类,从而正确生成包含属性的Schema。

应用任意一种方案后,你的StringInterface的Schema应该会和Springfox 2.9.*版本一致,正确显示s属性了。

内容的提问来源于stack exchange,提问作者Joseph K. Strauss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:07:29