Springfox3生成OpenAPI漏洞:泛型继承响应类的maxItems配置
解决Springfox 3.0.0生成OpenAPI时数组未指定maxItems的问题
使用Springfox 3.0.0生成OpenAPI文档时,因泛型父类BaseResponse无法修改,导致返回的数组类型字段result缺少maxItems约束,触发漏洞提示。以下是两种可行解决方案:
方案一:在子类中重写字段并添加Swagger注解
由于BaseResponse是库类无法修改,可在自定义的Response子类中重新声明result字段,通过OpenAPI 3.0的@Schema注解指定maxItems:
public class Response extends BaseResponse<List<QueryResult>> { // 重写result字段,添加最大元素数约束 @Schema(description = "查询结果列表", maxItems = 10) private List<QueryResult> result; // 保持与父类一致的getter/setter方法 public List<QueryResult> getResult() { return result; } public void setResult(List<QueryResult> result) { this.result = result; } }
若使用兼容Swagger 2.0的旧版注解,可替换为:
@ApiModelProperty(arraySchema = @ArraySchema(maxItems = 10)) private List<QueryResult> result;
方案二:自定义Springfox插件动态修改模型
若不想重写字段,可通过Springfox的扩展插件,在文档生成阶段动态为目标字段添加maxItems约束:
- 创建Swagger配置类并注册自定义插件:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ModelBuilderPlugin; import springfox.documentation.schema.ArraySchema; import springfox.documentation.schema.ModelContext; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelPropertyContext; import java.util.Optional; @Configuration public class SwaggerCustomConfig { @Bean public ModelBuilderPlugin arrayMaxItemsEnforcer() { return new ModelBuilderPlugin() { @Override public void apply(ModelContext context) { // 匹配目标Response类 if (Response.class.isAssignableFrom(context.getType())) { // 找到result属性 Optional<ModelPropertyContext> resultProp = context.getModelBuilder().getProperties().stream() .filter(prop -> "result".equals(prop.getName())) .findFirst(); resultProp.ifPresent(propContext -> { // 判断属性是否为数组类型 if (propContext.getType().isContainerType() && propContext.getType().getElementType().isPresent()) { ArraySchema arraySchema = (ArraySchema) propContext.getSchema(); arraySchema.maxItems(10); // 设置最大元素数 } }); } } @Override public boolean supports(DocumentationType documentationType) { // 仅支持OpenAPI 3.0 return DocumentationType.OAS_30.equals(documentationType); } }; } }
该插件会在Springfox构建Response模型时,自动为result数组字段添加maxItems=10的约束,无需修改业务类代码。
验证生成的OpenAPI文档,Response的result字段将包含目标配置:
"Response": { "type": "object", "properties": { "result": { "type": "array", "maxItems": 10, "items": { "$ref": "#/definitions/QueryResult" } } } }
内容的提问来源于stack exchange,提问作者Shyam Kumar
相关产品推荐
相关产品推荐

