Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

swagger-maven-plugin-jakarta generates list of types for all parameters when enabling openAPI31 #4676

Closed
ahmed-abdelmonem opened this issue May 21, 2024 · 5 comments
Assignees

Comments

@ahmed-abdelmonem
Copy link

ahmed-abdelmonem commented May 21, 2024

Hello,

I'm using swagger annotations and swager maven plugin to generate our openapi 3.1 specification file. The issue I'm facing is the extra array for parameter types which causes an issue when trying to call the endpoints from the swagger UI.

For example:

@Operation(summary = "Get a list of books",
             responses = { @ApiResponse(responseCode = HttpStatus.SC_OK_STR,
                                        description = HttpResponse.SC_OK), //
                           @ApiResponse(responseCode = HttpStatus.SC_BAD_REQUEST_STR,
                                        description = HttpResponse.SC_BAD_REQUEST) //
             })
  public Response getBooks(@Parameter( required = true, name = "id", schema = @Schema(type = "string")) @PathParam("id") String id) 

will generate:

"/books/{id}" : {
      "get" : {
        "operationId" : "getBooks",
        "parameters" : [ {
          "in" : "path",
          "name" : "id",
          "required" : true,
          "schema" : {
            "type" : [ "string" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "type" : [ "string" ]
                  }
                }
              }
            },
            "description" : "Successful Operation"
          },
          "400" : {
            "description" : "Bad Request"
          }
        },
        "summary" : "Get a list of books",
      }
    }

We are using the generated spec file with the latest version of Swagger UI (5.17.10).
The issue happens when trying to execute any endpoint with parameters with error "Required field is not provided" even if the field is provided.

@frantuma
Copy link
Member

Thanks for reporting this.

How are you serializing the OpenAPI result to JSON? using the maven plugin? Probably the issue comes from not using Yaml31 class for (de)serialization

If the issue persist, please provide the full config to be able to reproduce the issue

@ahmed-abdelmonem
Copy link
Author

ahmed-abdelmonem commented May 21, 2024

Thanks for your reply.

I'm serializing the OpenAPI result to JSON using the maven plugin with the below config

<plugin>
	<groupId>io.swagger.core.v3</groupId>
	<artifactId>swagger-maven-plugin-jakarta</artifactId>
	<executions>
		<execution>
			<id>test</id>
			<phase>compile</phase>
			<goals>
				<goal>resolve</goal>
			</goals>
			<configuration>
				<contextId>test</contextId>
				<outputFileName>swagger</outputFileName>
				<outputPath>${project.build.directory}/classes</outputPath>
				<outputFormat>JSON</outputFormat>
				<configurationFilePath>${basedir}/src/main/resources/swagger/configurationFile.json</configurationFilePath>
			</configuration>
		</execution>
	</executions>
</plugin>

and config file

{
  "resourcePackages": [
    "com.test.rest"
  ],
  "prettyPrint" : true,
  "sortOutput" : true,
  "openAPI31" : true,
  "openAPI": {
    "info": {
      "version": "1.0",
      "title": "Test API",
      "description": "Test API."
    },
    "servers": [
      {
        "url": "$BASE-PATH$"
      }
    ]
  }
}

@ahmed-abdelmonem ahmed-abdelmonem changed the title swagger-maven-plugin generates list of types for all parameters when enabling openAPI31 swagger-maven-plugin-jakarta generates list of types for all parameters when enabling openAPI31 May 21, 2024
@frantuma frantuma self-assigned this May 22, 2024
@frantuma
Copy link
Member

This is indeed a bug occurring when setting sortOutput to true. It has been fixed in #4677, and will be available in next release.

Said that, the result is actually still correct in terms of compliance with OpenAPI 3.1, and semantically equal to having type value as string instead of array of strings with single value.

This is also supported by Swagger UI (for OAS 3.1), not sure why you're: which causes an issue when trying to call the endpoints from the swagger UI.

With current version removing the sortOutput property will result in a single value in type

@ahmed-abdelmonem
Copy link
Author

@frantuma Thank you for fixing the issue. I meant that having the type as an array of strings caused an error when executing the endpints from the Swagger UI.

I have tested again after setting the sortOutput to false and it looks good in the UI but the APIs are not sorted as expected which should be fixed in the next release.

@ahmed-abdelmonem
Copy link
Author

Hi @frantuma, I wanted to inquire about the scheduled time for the next release. Could you please let me know when it is planned?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants