Problem z generowaniem kodu ze swaggera

0

Cześć.
Mam takie wyzwanie: Dostałem jako źródło OpenApi w postaci yamla.
wygenerowałem takie klasy:
W tym api mam jeden główny obiekt, który ma kilka pól, te pola mogą być jedną z klas implementacjach Interfejs (to odpowiada of oneOf)

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "clientType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = FirstClass.class, name = "FIRST_CLASS"),
        @JsonSubTypes.Type(value = SecondClass.class, name = "SECOND_CLASS")
})
public interface SomeInterface {

}

Odpalam server, odpalam swaggera lokalnie, generuje api.
Raz, że nie widać w dokumentacj tego oneOf, a dwa, że zamiast oneOf mam allOf tego Interfejsu, a klasy, które są wygenerowane z tego "mojego" nie odpowiadają temu co mam w kodzie.

Czy ktoś może miał podobny problem i wie jak go obejść?

0

Dobra, przykład:

openapi: 3.0.0
info:
  version: 1.0.0
  title: Simple API
  description: A simple API to illustrate OpenAPI concepts

paths:
  /cats:
    post:
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
               - $ref: '#/components/schemas/CatBus'
      responses:
        '200':
          description: ok
      
components:
  schemas:
    RedCat:
      type: object
      properties:
        redprops:
          type: integer
        color:
          type: string
    WhiteCat:
      type: object
      properties:
        whiteprops:
          type: integer
        color:
          type: string
    CatBus:
      type: object
      properties:
        busName:
          type: string
        cat:
          type: object
          oneOf:
              - $ref: '#/components/schemas/WhiteCat'
              - $ref: '#/components/schemas/RedCat'

Interfes:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* OneOfCatBusCat
*/
@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = WhiteCat.class, name = "WhiteCat"),
  @JsonSubTypes.Type(value = RedCat.class, name = "RedCat")
})
public interface OneOfCatBusCat {

}

a dokumentacja:
Oryginalna:

screenshot-20240513144704.png

Wygenerowana u mnie:

screenshot-20240513144830.png

0

Nie bardzo rozumiem co ty dokładnie robisz? Możesz dać do porównania oryginał i ten wygenerowany przez ciebie yaml? Ostatecznie czy masz pewność co do poprawności oryginalnego schematu? Ja kiedyś dostałem taki, co ktoś z palca poprawiał i wygenerowany source dla php działało ale dla javy nie puszczało bo czegoś tam nie mógł przetworzyć.

0

Hey. Orginał:

---
openapi: 3.0.0
info:
  version: 1.0.0
  title: Simple API
  description: A simple API to illustrate OpenAPI concepts

paths:
  /cats:
    post:
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
               - $ref: '#/components/schemas/CatBus'
      responses:
        '200':
          description: ok
      
components:
  schemas:
    RedCat:
      type: object
      properties:
        redprops:
          type: integer
        color:
          type: string
    WhiteCat:
      type: object
      properties:
        whiteprops:
          type: integer
        color:
          type: string
    CatBus:
      type: object
      properties:
        busName:
          type: string
        cat:
          type: object
          oneOf:
              - $ref: '#/components/schemas/WhiteCat'
              - $ref: '#/components/schemas/RedCat'

To co gneruje mi swagger na localhoście:

openapi: 3.0.1
info:
  title: Simple API
  description: A simple API to illustrate OpenAPI concepts
  termsOfService: ''
  license:
    name: ''
    url: http://unlicense.org
  version: 1.0.0
servers:
  - url: http://localhost:8080
    description: Generated server url
paths:
  /cats:
    post:
      tags:
        - cats-api-controller
      operationId: catsPost
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/CatBus'
        required: true
      responses:
        '200':
          description: ok
components:
  schemas:
    CatBus:
      type: object
      allOf:
        - $ref: '#/components/schemas/CatsBody'
        - type: object
          properties:
            busName:
              type: string
            cat:
              $ref: '#/components/schemas/OneOfCatBusCat'
    CatsBody:
      required:
        - type
      type: object
      properties:
        type:
          type: string
      discriminator:
        propertyName: type
    OneOfCatBusCat:
      required:
        - type
      type: object
      properties:
        type:
          type: string
      discriminator:
        propertyName: type
0

Kod jest tutaj:
https://github.com/bartgora/swagger-problem
Wygląda, jakby ignorował w ogóle klasy, tylko konwertował interfejs

0

Jak ty generujesz kod hosta z openapi? Przecież to służy do generowania endpointa w wyznaczonym języku. Może czegoś nie wiem?

0

No a "endpoint" to gdzie byś chciał/a mieć? Jak masz np Swagger Editor - to możesz kliknąć w Export, in np. wybrać generate server stub, i tam jest kilka opcji m.in. spring,go, nodejs. i tak możesz prost serwer z tym "endpointem" postawić i uruchomić.
Ktoś chce z tego korzystać to używa tego samego kontraktu do stworzenia klienta.
Chcesz żeby to twój serwer zwracał ten kontrakt, więc wystawia openapi.

0
hzmzp napisał(a):

Jak ty generujesz kod hosta z openapi? Przecież to służy do generowania endpointa w wyznaczonym języku. Może czegoś nie wiem?

Możesz sobie wygenerować takiego stuba dla providera, na podsawie yamla/jsona i użyć w testach kontraktów.

@Black007 spróbuj wygenerować inną maszynką: https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.5.0/

java -jar openapi-generator-cli-7.5.0.jar generate -i api.yaml -g spring -o ./generated-server
java -jar openapi-generator-cli-7.5.0.jar generate -i api.yaml -g java -o ./generated-client

Możliwe, że ten swagger ma jakiegoś babola.

0

@yarel Niestety nie pomogło:

{
"openapi": "3.0.1",
"info": {
"title": "Simple API",
"description": "A simple API to illustrate OpenAPI concepts",
"version": "1.0.0"
},
"servers": [
{
"url": "http://localhost:8080",
"description": "Generated server url"
}
],
"tags": [
{
"name": "cats",
"description": "the cats API"
}
],
"paths": {
"/BartomiejGora/InheritenceTest/1.0.0/cats": {
"post": {
"tags": [
"cats"
],
"operationId": "catsPost",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatsPostRequest"
}
}
}
},
"responses": {
"200": {
"description": "ok"
}
}
}
}
},
"components": {
"schemas": {
"CatsPostRequest": {
"type": "object"
}
}
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1