клиент swagger-codegen: как включить аннотации Джексона в модели

Я использую 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 для добавления аннотаций Джексона в модель.

Большое спасибо...


person satellite satellite    schedule 12.01.2017    source источник
comment
Глядя на код для Java и templates, вам нужно сделать что-то, что добавит свойство jackson в дополнительные свойства. Посмотрите additionalProperties.put("jackson", "true"); в первой ссылке и разберитесь, как это получить   -  person moondaisy    schedule 19.01.2017
comment
Вы нашли решение для этого?   -  person matrixguy    schedule 04.05.2020


Ответы (2)


Вместо использования

    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/ Codegen api:/gen/clients/{language}), то вы можете просмотреть настройки в /gen/clients/{language} или https://openapi-generator.tech/docs/generators/java/ и создайте свой запрос в соответствии с этим.

person dino    schedule 04.06.2020

Добавьте следующую строку кода в конфигурацию вашего плагина в pom.xml

‹'библиотека>$libraryValue‹'/библиотека>

$libraryValue может основываться на том, какую библиотеку вы используете в своих зависимостях. Либо jersey one, если вы используете Jersey 1.x.x, либо jersey2, если вы используете Jersey 2.x.x.

Спасибо https://stackoverflow.com/users/3695939/moondaisy за предоставленный вами старт.

person Dhinesh Kumar    schedule 06.06.2017