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

