7

我正在使用 swagger-codegen 生成一个休息客户端,但我遇到了一个问题,我正在使用的服务返回一个具有继承的模型,API 模型如下所示:

public class Person
{
    private List<Book> books;
    ...
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "typeClass")
@JsonSubTypes({ @JsonSubTypes.Type(value = Magazine.class) })
public class Book 
{
    //some prop
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "typeClass")
public class Magazine extends Book
{
    //some prop
}

API 模型使用杰克逊注解来处理继承。API 工作正常。当我生成客户端时,客户端模型没有杰克逊注解,所以当我使用生成的客户端使用 API 时,它总是使用 Book 类进行反序列化。它没有“看到” Magazine 类。我认为这是因为生成的模型没有杰克逊注释来处理继承。

如何配置 swagger-codegen 以将杰克逊注释添加到模型中。

非常感谢...

4

2 回答 2

6

而不是使用

    java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate 
   -i http://petstore.swagger.io/v2/swagger.json   
    -l java
    -o samples/client/petstore/java

你可以一起工作

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate 
-i http://petstore.swagger.io/v2/swagger.json   
-l spring
-o samples/client/petstore/java

通过语言更改,他们还将 gson 换成了 Jackson。

在你的情况下,你会有类似的东西

import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.model.Category;
import io.swagger.model.Tag;
import java.util.ArrayList;
import java.util.List;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.*;

/**
 * Pet
 */
@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-06-04T13:33:18.844+02:00")




public class Pet   {
  @JsonProperty("id")
  private Long id = null;

  @JsonProperty("category")
  private Category category = null;

  @JsonProperty("name")
  private String name = null;

  @JsonProperty("photoUrls")
  @Valid
  private List<String> photoUrls = new ArrayList<String>();

  @JsonProperty("tags")
  @Valid
  private List<Tag> tags = null;
      ...

来源:https ://github.com/swagger-api/swagger-codegen/issues/5785

当您使用 Generator.Swagger ( https://generator.swagger.io/在线 swagger Codegen api:/gen/clients/{language}) 构建客户端时,您可以查看 /gen/clients/{language } 或https://openapi-generator.tech/docs/generators/java/并构建您的请求。

于 2020-06-04T11:29:42.563 回答
1

在 pom.xml 的插件配置中添加以下代码行

<'library>$libraryValue</'/library>

$libraryValue 可以基于您在依赖项中使用的库。如果您使用的是 Jersey 1.xx,则为球衣一号;如果您使用的是 Jersey 2.xx,则为球衣 2

感谢https://stackoverflow.com/users/3695939/moondaisy您提供的领先优势。

于 2017-06-06T05:43:43.820 回答