OpenAPITools / OpenAPITools/openapi-generator

[BUG] oneOf property in response doesn't work

Open
#11,595 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

I am trying to generate different response model based on "oneOf" attribute, but it doesn't work at all
openapi-generator-maven-plugin : 5.3.0
openapi-generator.version : 5.3.0

Error message :


[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApi.java:[8,34] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: package com.baeldung.openapi.model
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApiDelegate.java:[3,34] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: package com.baeldung.openapi.model
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApi.java:[41,28] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: interface com.baeldung.openapi.api.SomethingApi
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApiDelegate.java:[32,28] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: interface com.baeldung.openapi.api.SomethingApiDelegate
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApi.java:[33,81] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: interface com.baeldung.openapi.api.SomethingApi
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/api/SomethingApi.java:[35,65] cannot find symbol
  symbol:   class OneOfApiResultOkApiResultError
  location: interface com.baeldung.openapi.api.SomethingApi
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/model/ApiResultOk.java:[22,10] incompatible types: java.lang.String cannot be converted to java.lang.Boolean
[ERROR] /Users/mostafaramadan/Documents/DummyProjects/openapi/target/generated-sources/openapi/src/main/java/com/baeldung/openapi/model/ApiResultError.java:[22,11] incompatible types: java.lang.String cannot be converted to java.lang.Boolean
[INFO] 8 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.831 s
[INFO] Finished at: 2022-02-12T18:36:39+02:00

Yml file:

openapi: "3.0.0"
info:
  version: 1.0.0
  title: Swagger Petstore
  license:
    name: MIT
servers:
  - url: http://localhost:8080/
paths:
  /something:
    get:
      responses:
        '200':
          description: Result
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ApiResultOk'
                  - $ref: '#/components/schemas/ApiResultError'
              examples:
                success:
                  summary: Example of a successful response
                  value:
                    result: true
                    token: abcde12345
                error:
                  summary: Example of an error response
                  value:
                    result: false
                    errorCode: "00002"
                    errorMsg: "duplicated account already exist"

components:
  schemas:
    ApiResultOk:
      type: object
      properties:
        result:
          type: boolean
          enum: [ true ]
        token:
          type: string
      required:
        - result
        - token
    ApiResultError:
      type: object
      properties:
        result:
          type: boolean
          enum: [ false ]
        errorCode:
          type: string
          example: "00002"
        errorMsg:
          type: string
          example: "duplicated account already exist"

Pom.xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<artifactId>spring-boot-libraries-2</artifactId>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
		</dependency>

		<!-- openapi -->
		<dependency>
			<groupId>org.openapitools</groupId>
			<artifactId>openapi-generator</artifactId>
			<version>${openapi-generator.version}</version>
		</dependency>
		<dependency>
			<groupId>org.openapitools</groupId>
			<artifactId>jackson-databind-nullable</artifactId>
			<version>${jackson-databind.version}</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>${springfox.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.awaitility</groupId>
			<artifactId>awaitility</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.openapitools</groupId>
				<artifactId>openapi-generator-maven-plugin</artifactId>
				<version>5.3.0</version>
				<executions>
					<execution>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<inputSpec>
								${project.basedir}/src/main/resources/petstore.yml
							</inputSpec>
							<generatorName>spring</generatorName>
							<apiPackage>com.baeldung.openapi.api</apiPackage>
							<modelPackage>com.baeldung.openapi.model</modelPackage>
							<supportingFilesToGenerate>
								ApiUtil.java
							</supportingFilesToGenerate>
							<configOptions>
								<delegatePattern>true</delegatePattern>
							</configOptions>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

	<properties>
		<jobrunr.version>3.1.1</jobrunr.version>
		<awaitility.version>4.0.3</awaitility.version>
		<openapi-generator.version>5.3.0</openapi-generator.version>
		<spring.data.version>2.4.5</spring.data.version>
		<jackson-databind.version>0.2.1</jackson-databind.version>
		<springfox.version>2.9.2</springfox.version>
	</properties>

</project>

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the OpenAPI schema in src/main/resources/petstore.yml and reproduce generation with the spring generator configured in pom.xml using version 5.3.0. Inspect the generated SomethingApi.java, SomethingApiDelegate.java, ApiResultOk.java, and ApiResultError.java files; done means the generated project compiles and the oneOf response model is generated consistently.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.