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

如何让OpenAPI默认将java.util.Duration识别为字符串类型?

全局配置springdoc将java.util.Duration默认识别为字符串类型

当然可行,你可以通过自定义springdoc的ModelConverter来全局覆盖Duration类型的Schema生成逻辑,无需给每个字段手动添加@Schema注解。具体实现步骤如下:

实现自定义ModelConverter配置类

创建一个Spring配置类,注册自定义的ModelConverter Bean,专门处理Duration类型的Schema生成:

import io.swagger.v3.core.converter.ModelConverter;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.Set;
import java.time.Duration;

@Configuration
public class OpenApiDurationConfig {

    @Bean
    public ModelConverter durationModelConverter() {
        return new ModelConverterPlugin() {
            @Override
            public ResolvedSchema resolve(Type type, ModelConverterContext context, Iterator<ModelConverter> chain) {
                // 识别Duration类型,生成对应的string类型Schema
                if (type instanceof Class<?> && Duration.class.isAssignableFrom((Class<?>) type)) {
                    Schema<String> durationSchema = new Schema<>();
                    durationSchema.setType("string");
                    durationSchema.setFormat("duration");
                    durationSchema.setExample("PT1H30M"); // 可选:添加ISO 8601格式的示例值
                    return new ResolvedSchema(null, durationSchema);
                }
                // 非Duration类型,交给后续转换器处理
                return chain.next().resolve(type, context, chain);
            }

            @Override
            public void addAnnotations(Set<Class<?>> annotations) {
                // 无需额外处理注解
            }
        };
    }
}

配置说明

  • 这个自定义转换器会在springdoc解析DTO类型时,自动拦截Duration类型的字段,生成符合OpenAPI规范的string类型Schema(format为duration,对应ISO 8601格式)。
  • 该配置不会影响Jackson的序列化/反序列化逻辑,你之前依赖jackson-datatype-jsr310实现的ISO 8601格式字符串转换仍会正常工作。
  • 所有DTO中的Duration字段都会自动应用这个Schema规则,无需重复添加@Schema(type = "string", format = "duration")注解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:54:56