gpt4 book ai didi

java - 如何使用 Quarkus 在 RestEasy 中为 MultipartFormDataInput 提供 swagger 注释

转载 作者:行者123 更新时间:2023-12-03 11:20:15 33 4
gpt4 key购买 nike

在使用 RestEasy 框架处理 Quarkus 时,我可以使用 MultipartFormDataInput 上传文件。 .此功能按预期工作,但我无法为 swagger UI 提供正确的开放 API 注释。我尝试了多种选择和组合,但都没有结果。请帮我。我在示例代码下方提供。

@Operation(summary = "Upload a single file", description = "Upload a single file")
@APIResponses({
@APIResponse(responseCode = "200", description = "Upload file successfully"),
@APIResponse(name = "500", responseCode = "500", description = "Internal service error") })
@RequestBody(content = @Content(
mediaType = MediaType.MULTIPART_FORM_DATA,
schema = @Schema(type = SchemaType.STRING, format = "binary"),
encoding = @Encoding(name = "attachment", contentType = "application/octet-stream")))
@POST
@Path("/singleFile")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_PLAIN)
public Response handleFileUpload(@MultipartForm MultipartFormDataInput input) {
String fileName = null;

Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
// Get file data to save
List<InputPart> inputParts = uploadForm.get("attachment");
for (InputPart inputPart : inputParts) {
try {
MultivaluedMap<String, String> header = inputPart.getHeaders();
fileName = getFileName(header);
InputStream inputStream = inputPart.getBody(InputStream.class, null);
byte[] bytes = IOUtils.toByteArray(inputStream);
File customDir = new File(UPLOAD_DIR);
if (!customDir.exists()) {
customDir.mkdir();
}
fileName = customDir.getCanonicalPath() + File.separator + fileName;
Files.write(Paths.get(fileName), bytes, StandardOpenOption.CREATE);
return Response.status(200).entity("Uploaded file name : " + fileName).build();
} catch (Exception e) {
e.printStackTrace();
}
}
return Response.status(200).entity("Uploaded file name : " + fileName).build();
}
我还引用了以下链接。
https://community.smartbear.com/t5/Swagger-Open-Source-Tools/How-to-swagger-annotate-multipart-form-data-with-resteasy/td-p/178776
https://github.com/swagger-api/swagger-core/issues/3050
如果我创建一个名为 MultipartBody 的单独类,我可以生成 swagger UI与 @Schema(type = SchemaType.STRING, format = "binary") and @PartType(MediaType.APPLICATION_OCTET_STREAM)注解。但我的要求是只使用 MultipartFormDataInput .

最佳答案

你快到了 :) 只需在你的 RequestBody/Schema 中使用一个专用类并告诉 OpenAPI 忽略你的方法的参数。

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@RequestBody(content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA,
schema = @Schema(implementation = MultipartBody.class))
)
@Operation(operationId = "uploadFile")
public Response uploadFile(@Parameter(hidden = true) MultipartFormDataInput input) {
//... your logic here
}
需要注意的两点: @Parameter(hidden = true)告诉 Smallrye OpenAPI 不要考虑你的 MultipartFormDataInput生成 Schema 模型时。然后你需要使用 @RequestBody 明确地告诉描述模式,其中 MultipartBody是一个描述所有输入参数的类(如果你想传递其他 Prop 以及文件有效负载,你可以在那里添加更多参数)
public class MultipartBody {

@FormParam("file")
@Schema(type = SchemaType.STRING, format = "binary", description = "file data")
public String file;


@FormParam("fileName")
@PartType(MediaType.TEXT_PLAIN)
public String fileName;
}
只要确保 @FormParam MultipartBody 中的注释字段匹配您希望在 MultipartFormDataInput 中找到的 ,,parts"- 例如,在您的情况下,文件属性应该具有 @FormParam("attachment")

关于java - 如何使用 Quarkus 在 RestEasy 中为 MultipartFormDataInput 提供 swagger 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64079847/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com