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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:12:08