Hi Jean Pierre,
I suspect the @Multipart annotation is coming from CXF
(org.apache.cxf.jaxrs.ext.multipart.Multipart), right? If yes,
this is not a part of JAX-RS specification but CXF specific extension. You may
need to add Swagger API annotation to
the parameters in question:
@Parameter(schema = @Schema(type = "string", format = "binary"))
Hope it helps.
Thank you.
Best Regards,
Andriy Redko
Monday, July 1, 2024, 12:09:17 PM, you wrote:
> Hi all,
> I am having problems to correctly annotate service methods which consumes
> multipart/form-data that contains attachments next to other model objects.
> I’ve an openapi specification that contains following requestBody definition:
> /messages:
> post:
> tags:
> - "messages"
> summary: "Send a message, using a channel (email, paper mail, ebox) and
> delivery method (registered or normal) of your choice. More than 6 upfiles
> only supported for PAPER delivery."
> operationId: createMessage
> parameters:
> - $ref: '#/components/parameters/CorrelationId'
> - $ref: '#/components/parameters/Idempotency-Key'
> requestBody:
> content:
> multipart/form-data:
> schema:
> type: object
> required:
> - messageToSend
> properties:
> messageToSend:
> $ref: '#/components/schemas/MessageToSend'
> upfile1:
> type: string
> format: binary
> nullable: true
> upfile2:
> type: string
> format: binary
> nullable: true
> upfile3:
> type: string
> format: binary
> nullable: true
> upfile4:
> type: string
> format: binary
> nullable: true
> upfile5:
> type: string
> format: binary
> nullable: true
> upfile6:
> type: string
> format: binary
> nullable: true
> upfile7:
> type: string
> format: binary
> nullable: true
> upfile8:
> type: string
> format: binary
> nullable: true
> upfile9:
> type: string
> format: binary
> nullable: true
> upfile10:
> type: string
> format: binary
> nullable: true
> upfile11:
> type: string
> format: binary
> nullable: true
> upfile12:
> type: string
> format: binary
> nullable: true
> upfile13:
> type: string
> format: binary
> nullable: true
> upfile14:
> type: string
> format: binary
> nullable: true
> upfile15:
> type: string
> format: binary
> nullable: true
> upfile16:
> type: string
> format: binary
> nullable: true
> upfile17:
> type: string
> format: binary
> nullable: true
> upfile18:
> type: string
> format: binary
> nullable: true
> upfile19:
> type: string
> format: binary
> nullable: true
> upfile20:
> type: string
> format: binary
> nullable: true
> qrfile:
> type: string
> format: binary
> nullable: true
> required: true
> When using the openapi-generator-maven-plugin v7.6.0 it generates following
> method signature:
> @POST
> @Path("/messages")
> @Consumes("multipart/form-data")
> @Produces({ "application/json" })
> @Operation(
> summary = "Send a message, using a channel (email,
> paper mail, ebox) and delivery method (registered or normal) of your choice.
> More than 6 upfiles only supported for PAPER delivery.",
> tags = {"messages" },
> operationId="createMessage",
>
> security=@SecurityRequirement(name="BearerAuthentication"),
> responses= {
> @ApiResponse(
> responseCode = "201",
> description =
> "Created",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,array=@ArraySchema(schema=@Schema(implementation=SendStatusMessage.class))),
> headers = {@Header(
>
> name="X-Magda-Exceptions",
>
> required=false,
>
> description="Only used in the context of EBOX
> delivery and if there was a problem with the consent of the receiver's ebox.",
>
>
> schema=@Schema(implementation=MagdaExceptionList.class))
>
> }),
> @ApiResponse(
> responseCode = "400",
> description =
> "Invalid data supplied",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class))),
> @ApiResponse(
> responseCode = "401",
> description =
> "Invalid authorization",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class))),
> @ApiResponse(
> responseCode = "500",
> description =
> "Unexpected Server Error",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class))),
> @ApiResponse(
> responseCode = "502",
> description = "Bad
> Gateway",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class))),
> @ApiResponse(
> responseCode = "503",
> description =
> "Service unavailable",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class))),
> @ApiResponse(
> responseCode = "504",
> description =
> "Gateway Timeout",
> content =
> @Content(mediaType=MediaType.APPLICATION_JSON,schema=@Schema(implementation=ErrorMessage.class)))
> })
> public Response createMessage(
> @HeaderParam("x-correlation-id") @NotNull @Size(min =
> 10, max = 36) @Parameter(description="ID of the transaction. Use this ID for
> log tracing and incident handling.") String xCorrelationId,
> @HeaderParam("Idempotency-Key") @Size(min = 10, max =
> 36) @Parameter(description="When retrying a failed call, the retry call
> should have the same Idempotency Key.") String idempotencyKey,
> @Multipart(value = "messageToSend”, required= true)
> MessageToSend messageToSend,
> @Multipart(value = "upfile1", required = false)
> Attachment upfile1Detail,
> @Multipart(value = "upfile2", required = false)
> Attachment upfile2Detail,
> @Multipart(value = "upfile3", required = false)
> Attachment upfile3Detail,
> @Multipart(value = "upfile4", required = false)
> Attachment upfile4Detail,
> @Multipart(value = "upfile5", required = false)
> Attachment upfile5Detail,
> @Multipart(value = "upfile6", required = false)
> Attachment upfile6Detail,
> @Multipart(value = "upfile7", required = false)
> Attachment upfile7Detail,
> @Multipart(value = "upfile8", required = false)
> Attachment upfile8Detail,
> @Multipart(value = "upfile9", required = false)
> Attachment upfile9Detail,
> @Multipart(value = "upfile10", required = false)
> Attachment upfile10Detail,
> @Multipart(value = "upfile11", required = false)
> Attachment upfile11Detail,
> @Multipart(value = "upfile12", required = false)
> Attachment upfile12Detail,
> @Multipart(value = "upfile13", required = false)
> Attachment upfile13Detail,
> @Multipart(value = "upfile14", required = false)
> Attachment upfile14Detail,
> @Multipart(value = "upfile15", required = false)
> Attachment upfile15Detail,
> @Multipart(value = "upfile16", required = false)
> Attachment upfile16Detail,
> @Multipart(value = "upfile17", required = false)
> Attachment upfile17Detail,
> @Multipart(value = "upfile18", required = false)
> Attachment upfile18Detail,
> @Multipart(value = "upfile19", required = false)
> Attachment upfile19Detail,
> @Multipart(value = "upfile20", required = false)
> Attachment upfile20Detail,
> @Multipart(value = "qrfile", required = false)
> Attachment qrfileDetail);
> If I now generate the swagger from this code (I modified the annotations in
> the generated code for using OAS v3 annotations through swagger-jaxrs2
> v2.1.13 and I am using cxf-v3.5.6 having swagger-ui v4.18.2 generate the user
> interface) none of the upload files appears as request parameter, only the
> messageToSend is shown.
> Is the above signature for the method createMessage(...) incorrect?
> If I look at the generated openapi.json all the Attachment upFiles are
> missing from the specification? So is it a problem/short-coming(?) of the
> used software libraries, which then:
> · cxf-rt-rs-service-description-common-openapi v3.5.6 -> this
> library references swagger-jaxrs2 v2.1.13
> · swagger-jaxrs2 v2.1.13 ->
> can I upgradethis to e.g. swagger-jaxrs2 v2.2.22 (latest) while retaining cxf
> v3.5.6?
> · ...another?
> Regards,
> J.P.