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

