当前位置: 首页 > 知识库问答 >
问题:

Swagger one Of type: Jackson试图实例化接口而不是实现?

水瀚漠
2023-03-14

我正在使用oneOf特性定义几个可能的模式,这些模式可以进入我的服务的请求体属性。在生成的Java客户机代码中,这些模式的Java实现实现了一个接口,但是当我通过发送请求时,Jackson试图创建接口的实例,而不是具体的类。

大摇大摆的代码版本

<groupId>io.swagger.codegen.v3</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.14</version>

招摇过市声明文件内容

schemas:
    TestRequest:
      description: 
        Test request
      type:
        object
      required:
        - criteria
      properties:
        criteria:
          oneOf:
           - $ref: '#/components/schemas/CriteriaA'
           - $ref: '#/components/schemas/CriteriaB'
    ...
    CriteriaA:
      description: Criteria A
      type: object
      required:
        - type
        - query
      properties:
        type: 
          description: A description
          type: string
          enum:
           - CriteriaA
      query:
        description: A query.
        type: object

繁殖的步骤

swagger codegen生成的Java客户端代码如下所示:

接口:

public interface OneOfTestRequestCriteria {}

混凝土等级:

@Schema(description = "")
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaClientCodegen", date = "2020-01-28T13:06:29.942Z[Europe/London]")
public class CriteriaA implements OneOfTestRequestCriteria {

  @JsonAdapter(TypeEnum.Adapter.class)
  public enum TypeEnum {
    CriteriaA("CriteriaA");

    private String value;

    TypeEnum(String value) {
      this.value = value;
    }
    public String getValue() {
      return value;
    }

    @Override
    public String toString() {
      return String.valueOf(value);
    }
    public static TypeEnum fromValue(String text) {
      for (TypeEnum b : TypeEnum.values()) {
        if (String.valueOf(b.value).equals(text)) {
          return b;
        }
      }
      return null;
    }
    public static class Adapter extends TypeAdapter<TypeEnum> {
      @Override
      public void write(final JsonWriter jsonWriter, final TypeEnum enumeration) throws IOException {
        jsonWriter.value(enumeration.getValue());
      }

      @Override
      public TypeEnum read(final JsonReader jsonReader) throws IOException {
        String value = jsonReader.nextString();
        return TypeEnum.fromValue(String.valueOf(value));
      }
    }
  }  @SerializedName("type")
  private TypeEnum type = null;

  @SerializedName("query")
  private Object query = null;

  public CriteriaA type(TypeEnum type) {
    this.type = type;
    return this;
  }

  @Schema(required = true, description = "")
  public TypeEnum getType() {
    return type;
  }

  public void setType(TypeEnum type) {
    this.type = type;
  }

  public CriteriaA query(Object query) {
    this.query = query;
    return this;
  }

  @Schema(required = true, description = "")
  public Object getQuery() {
    return query;
  }

  public void setQuery(Object query) {
    this.query = query;
  }


  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    CriteriaA criteriaA = (CriteriaA ) o;
    return Objects.equals(this.type, criteriaA.type) &&
        Objects.equals(this.query, criteriaA.query);
  }

  @Override
  public int hashCode() {
    return Objects.hash(type, query);
  }


  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class CriteriaA {\n");

    sb.append("    type: ").append(toIndentedString(type)).append("\n");
    sb.append("    query: ").append(toIndentedString(query)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }

}

我正在尝试使用生成的客户端代码发送请求:

final TestRequest testRequest = new TestRequest();

final CriteriaA criteriaA = new CriteriaA ();
criteriaA .setType(CriteriaA .TypeEnum.CriteriaA);
criteriaA .setQuery("a query");

testRequest .setCriteria(criteriaA );

final ApiResponse<Void> apiResponse = testApi.createOrUpdateTestWithHttpInfo(testRequest);

当Jackson尝试反序列化时,运行上述客户端代码会导致此错误。它似乎试图构建一个接口实例,而不是接口的具体实现;标准a:

[请求处理失败;嵌套异常是org.springframework.http.converter.HttpMessageConversionExcture:类型定义错误:[简单类型,类com.acme.tag.models.OneOfTestask estCriteria];嵌套异常是com.fasterxml.jackson.databind.exc.Invalid定义异常:无法构造com.acme.tag.models.OneOfTest刚需标准的实例(没有创建者,像默认值构造,存在):抽象类型要么需要映射到具体类型,具有自定义反序列化器,要么包含额外的类型信息\n

如果我注释生成的接口:

public interface OneOfTestRequestCriteria {}

具有以下内容:

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  @Type(value = CriteriaA.class, name = "CriteriaA")
})
public interface OneOfTestRequestCriteria {

}

然后请求正确地反序列化到CriteriaA-我是否在我的swagger.yaml中丢失了一些东西,这将导致这个接口没有被编码工具注释?

共有1个答案

施俊驰
2023-03-14
<groupId>io.swagger.codegen.v3</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.18</version>

另见:https://github.com/swagger-api/swagger-codegen-generators/pull/585

 类似资料:
  • 问题内容: 扩展初始化接口时提出的问题?),我们在实例化接口的同时用实现的类对其进行初始化。 我的问题是,为什么首先要使用Interface实例化它?为什么我不能直接用实现的类实例化它?例如。: Doc是接口,而SimpleDoc正在实现它。SimpleDoc有什么问题?mydoc = new SimpleDoc(); 哪里会失败? 问题答案: 通常,最好的方法是依赖系统中的抽象类型(接口或抽象类

  • 我正在从事一个C语言的项目,当我显式实例化模板类时,很难理解模板类的哪些成员被显式实例化。我编写了以下文件,然后使用Visual C 2008 Express Edition的发布配置编译该文件,然后将其放入反汇编程序。 忽略这个文件目前并不真正需要模板,这可以很好地编译。我将exe放入反汇编程序,它告诉我该测试 这导致测试

  • 本文向大家介绍Python接口自动化测试的实现,包括了Python接口自动化测试的实现的使用技巧和注意事项,需要的朋友参考一下 1)环境准备:   接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当工具不太适合项目时需要自己进行开发。   在我们项目

  • 问题内容: 这可能以前曾被问过,但是快速搜索只提出了询问C#的相同问题。看这里。 我基本上想做的是检查给定对象是否实现了给定接口。 我有点想出了一个解决方案,但这不足以在if或case语句中频繁使用它,我想知道Java是否没有内置解决方案。 编辑:好的,谢谢您的回答。特别是对于Damien Pollet和Noldorin,您让我重新考虑了设计,因此我不再测试接口。 问题答案: 该运营商确实在工作安

  • 我有三节课。 > 一个抽象类,abstractA有一个受保护的构造函数 一个类扩展了抽象类,父类有两个构造函数 一个类扩展父类,子类有一个构造函数 这是从抽象类扩展而来的父类 这是从父类扩展而来的子类 自定义组件看起来像这样 所以,当spring为特定测试实例化所有bean时,它会正确地实例化子bean。当父bean被实例化时,它得到2个bean[父和子]。所以,我最终会出错, 类型父的多个bea

  • 我定义了这个类: 在其他地方,在具有此签名的函数中: 我尝试返回新的ActorMapper(),但javac抱怨: 我可以投射它,它工作得很好,但为什么不能编译呢。有人能帮我吗?:)