Метод интерфейса, сгенерированный OpenApi, имеет возвращаемый тип как Object (Spring Boot 3)

Я определил API для регистрации пользователя. Я хочу вернуть SaveUserResponse после успешной регистрации пользователя. Однако интерфейс, созданный после сборки Gradle, имеет тип возвращаемого значения как Object.

Вот userapi.yaml

paths:
  /signup:
    post:
      description: User registration API
      operationId: signup
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignupRequest'

      responses:
        '201':
          description: CREATED
          content:
            application/json:
              schema:
                $ref: '#components/schemas/SaveUserResponse'


components:
  schemas:
    SignupRequest:
      type: object
      description: User model for GetARoom
      required:
        - firstName
        - lastName
        - email
        - password
      properties:
        firstName:
          type: string
          description: First name of the user
          minLength: 2
          maxLength: 15

        lastName:
          type: string
          description: Last name of the user
          minLength: 1
          maxLength: 15

        email:
          type: string
          description: User's email address.

        password:
          type: string
          format: password
          description: Password of the user
          pattern: /^(?=.*[0-9])(?=.*[a-z]).{8,12}$/
          minLength: 8
          maxLength: 12
    
    SaveUserResponse:
      type: object
      properties:
        accountNumber:
          type: integer
        userId:
          type: string

Следующий интерфейс был создан после сборки. Если вы заметили (строка 55), тип возврата регистрации — ResponseEntity<Object>, но я хочу вернуться ResponseEntity <SaveUserResponse>. Что мне не хватает?

Мой build.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'org.openapi.generator' version '6.6.0'
}

group = 'com.ums'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

sourceSets {
    main {
        java {
            srcDirs("$buildDir/generated/openapi/src/main/java")
        }
    }
}

openApiGenerate {
    generatorName = "spring"
    inputSpec.set("$projectDir/src/main/resources/api/userapi.yaml")
    outputDir.set("$buildDir/generated/openapi")
    apiPackage.set("com.ums.userservice.api")
    modelPackage.set("com.ums.userservice.model")
    configOptions = [
            library : "spring-boot",
            useSpringBoot3: "true"
    ]

    additionalProperties = [
            dateLibrary: "java8",
            generateModels: true,
            generateApis: true,
            interfaceOnly: true,
            skipDefaultInterface: true,
            useBeanValidation: true,
            serializableModel: true
    ]
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation group: 'org.openapitools', name: 'jackson-databind-nullable', version: '0.2.6'


    implementation group: 'io.swagger.core.v3', name: 'swagger-annotations', version: '2.2.21'
    implementation group: 'io.swagger', name: 'swagger-annotations', version: '1.6.14'

    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.24'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    annotationProcessor 'org.projectlombok:lombok:1.18.24'

    testCompileOnly 'org.projectlombok:lombok:1.18.24'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
}

tasks.named('test') {
    useJUnitPlatform()
}

tasks.withType(JavaCompile) {
    dependsOn(tasks.openApiGenerate)
}

Это странно, ваша схема выглядит правильно, и ваша версия последняя. Единственное, что меня удивило, это интерфейсOnly=true. Зачем вы это используете?

julaine 30.04.2024 15:40

нет, интерфейс имеет смысл, ваш API, в конце концов, является интерфейсом.

julaine 30.04.2024 15:40

есть ли SaveUserResponse где-нибудь в ваших сгенерированных источниках?

julaine 30.04.2024 15:41

@julaine да, модель SaveUserResponse можно найти в сгенерированном файле. Однако intelliJ говорит, что он нигде не используется (и это правда, поскольку по какой-то причине тип возвращаемого значения API равен Object). Можете ли вы попробовать приведенную выше конфигурацию на своей стороне, чтобы проверить, работает она правильно или нет?

Shreyansh Jain 30.04.2024 19:30

@julaine решено, смотри мой ответ :)

Shreyansh Jain 30.04.2024 21:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
5
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел проблему: она была со следующей строкой

$ref: '#components/schemas/SaveUserResponse' .

Должно быть '#/components/schemas/SaveUserResponse'

странное поведение по умолчанию — «Объект» вместо сбоя. Рад, что вы решили это.

julaine 02.05.2024 07:43

Другие вопросы по теме