Java中Swagger生成类读取时InvalidTypeIdException问题求助
解决Jackson解析Swagger生成的PipelineTask子类时的InvalidTypeIdException异常
在Java中读取Swagger生成的类时,遭遇InvalidTypeIdException异常,无法解析PipelineTask的子类型,错误提示缺少类型id属性'type',但OpenAPI定义中明明指定了taskType作为鉴别器。
相关代码与配置
OpenAPI定义
PipelineTask: anyOf: - $ref: '#/components/schemas/TranslationTask' - $ref: '#/components/schemas/ASRTask' - $ref: '#/components/schemas/TTSTask' discriminator: propertyName: taskType mapping: translation: '#/components/schemas/TranslationTask' asr: '#/components/schemas/ASRTask' tts: '#/components/schemas/TTSTask' PipelineTasks: type: array items: $ref: '#/components/schemas/PipelineTask' TranslationTask: required: - taskType type: object properties: taskType: $ref: '#/components/schemas/SupportedTasks' SupportedTasks: type: string enum: - translation - transliteration - tts - asr - document-layout - ocr - glossary - ner - txt-lang-detection - audio-lang-detection description: the category of model under which it has been released or trained
生成的PipelineTask接口
package io.swagger.pipelinerequest; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; /** * PipelineTask */ @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "taskType") @JsonSubTypes({ @JsonSubTypes.Type(value = TranslationTask.class, name = "translation"), @JsonSubTypes.Type(value = ASRTask.class, name = "asr"), @JsonSubTypes.Type(value = TTSTask.class, name = "tts") }) public interface PipelineTask { SupportedTasks getTaskType(); }
生成的TranslationTask实现类(实际类名:TranslationInference)
package io.swagger.model; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonCreator; import io.swagger.model.SupportedTasks; import io.swagger.model.TranslationRequest; import io.swagger.model.TranslationResponse; import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.validation.annotation.Validated; import javax.validation.Valid; import javax.validation.constraints.*; /** * TranslationInference */ @Validated @javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2023-03-02T03:55:25.562740452Z[GMT]") public class TranslationInference implements OneOfInferenceAPIEndPointSchema { @JsonProperty("taskType") private SupportedTasks taskType = null; @JsonProperty("request") private TranslationRequest request = null; @JsonProperty("response") private TranslationResponse response = null; public TranslationInference taskType(SupportedTasks taskType) { this.taskType = taskType; return this; } /** * Get taskType * @return taskType **/ @Schema(required = true, description = "") @NotNull @Valid public SupportedTasks getTaskType() { return taskType; } public void setTaskType(SupportedTasks taskType) { this.taskType = taskType; } // 其余方法省略 }
错误信息
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: 无法解析[简单类型,类io.swagger.pipelinerequest.PipelineTask]的子类型:缺少类型id属性'type'(针对POJO属性'pipelineTasks'),来源:(ByteArrayInputStream);行:12,列:9(通过引用链:io.swagger.pipelinerequest.PipelineRequest["pipelineTasks"]->io.swagger.pipelinerequest.PipelineTasks[0])
解决方案
1. 修复类名不匹配问题
OpenAPI定义中是TranslationTask,但生成的实际类是TranslationInference,导致@JsonSubTypes中指定的TranslationTask.class不存在,Jackson无法映射类型。
- 调整Swagger Codegen配置,确保生成的类名与OpenAPI中的schema名称一致;
- 或者修改OpenAPI定义,将
TranslationTask的schema名称改为TranslationInference,并同步更新discriminator的mapping。
2. 检查Jackson全局配置
确认项目中的ObjectMapper没有全局设置默认类型id属性为type,覆盖了@JsonTypeInfo中指定的taskType。如果有全局配置,需要针对PipelineTask相关类型单独配置,或者移除全局覆盖。
3. 验证JSON输入的正确性
确保请求JSON中pipelineTasks数组的每个对象都包含taskType字段,且字段值与discriminator的mapping完全匹配(如translation、asr、tts)。
4. 处理包路径与类扫描问题
PipelineTask接口在io.swagger.pipelinerequest包,而实现类在io.swagger.model包,需要确保Jackson能够扫描到这些类。可以:
- 在
ObjectMapper中手动注册这些子类; - 或者通过Jackson的模块扫描功能,配置扫描这两个包下的类。
内容的提问来源于stack exchange,提问作者Rathan
相关产品推荐
相关产品推荐

