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

如何修改SpringDoc生成OpenAPI规范的默认行为,实现字段默认必填(仅添加@Nullable时设为可选)

如何让SpringDoc默认将字段设为必填,仅@Nullable标记为可选

当然可以!SpringDoc提供了非常灵活的扩展点来调整它的默认行为,刚好能适配你“默认必填、仅@Nullable标记可选”的开发习惯。下面是两种可行的实现方案:

方案一:自定义Schema处理器(推荐)

你可以通过实现ModelConverterPlugin接口,拦截SpringDoc生成Schema的过程,手动修改字段的必填规则:

import io.swagger.v3.core.converter.ModelConverterContext;
import io.swagger.v3.core.converter.ModelConverterPlugin;
import io.swagger.v3.core.converter.ResolvedSchema;
import io.swagger.v3.oas.models.media.Schema;
import org.springframework.stereotype.Component;
import org.springframework.lang.Nullable;

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

@Component
public class DefaultRequiredSchemaPlugin implements ModelConverterPlugin {

    @Override
    public boolean supports(ModelConverterContext context, Type type) {
        // 只处理实体类类型,排除基础类型和集合
        return type instanceof Class<?> && !((Class<?>) type).isPrimitive();
    }

    @Override
    public ResolvedSchema resolve(Type type, ModelConverterContext context, Iterator<ModelConverterPlugin> chain) {
        // 先让默认处理器生成基础Schema
        ResolvedSchema resolvedSchema = chain.next().resolve(type, context, chain);
        Schema<?> schema = resolvedSchema.schema;
        
        if (schema != null && schema.getProperties() != null) {
            schema.getProperties().forEach((propName, propSchema) -> {
                boolean isNullable = false;
                // 检查字段是否带有@Nullable注解
                if (type instanceof Class<?>) {
                    try {
                        Field field = ((Class<?>) type).getDeclaredField(propName);
                        isNullable = field.isAnnotationPresent(Nullable.class);
                        // 如果字段在父类,这里可以扩展遍历父类字段的逻辑
                    } catch (NoSuchFieldException e) {
                        // 忽略字段不存在的情况(比如getter生成的属性)
                    }
                }
                
                // 没有@Nullable注解则设为必填
                if (!isNullable) {
                    propSchema.setRequired(true);
                    // 将字段加入Schema的必填列表
                    if (schema.getRequired() == null) {
                        schema.setRequired(new ArrayList<>());
                    }
                    if (!schema.getRequired().contains(propName)) {
                        schema.getRequired().add(propName);
                    }
                }
            });
        }
        
        return resolvedSchema;
    }
}

这个组件会被Spring自动扫描并加载到SpringDoc的处理流程中:

  • 它会遍历每个实体类的所有字段,检查是否带有@Nullable(不管是Spring的还是Javax的注解,只要类路径对应就行)
  • 没有该注解的字段,会被强制设置为必填,同时加入到OpenAPI Schema的必填字段列表里

方案二:全局配置调整(简化版)

如果你不想写复杂的插件,也可以通过自定义ModelConverter并注册到SpringDoc的配置中,核心逻辑和方案一一致:

import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.SpringDocConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringDocCustomConfig {

    @Bean
    public SpringDocConfiguration springDocConfiguration(SpringDocConfigProperties properties) {
        SpringDocConfiguration config = new SpringDocConfiguration(properties);
        // 注册自定义的Schema转换器
        config.getModelConverters().addConverter(new DefaultRequiredSchemaConverter());
        return config;
    }
    
    // 这里的DefaultRequiredSchemaConverter实现逻辑和方案一的插件类似,
    // 只是需要实现io.swagger.v3.core.converter.ModelConverter接口
}

注意事项

  • 如果你的字段上显式标注了@Schema(required = true/false),这个手动配置的优先级会高于我们的默认规则,不用担心被覆盖
  • 对于父类继承来的字段,方案一的代码可以扩展为遍历父类的字段,确保注解检查的完整性
  • 确保你项目中已经引入了对应的@Nullable注解依赖(比如Spring的org.springframework.lang.Nullable)

这样调整后,SpringDoc生成的OpenAPI文档就会完全匹配你的开发习惯——所有字段默认必填,只有标记了@Nullable的字段才会被设为可选!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:32:32