Swagger UI 不支持为 RestEasy 正确上传文件
Swagger UI doesn't support uploading a file properly for RestEasy
我将 JAX-RS (RestEasy) 与 Swagger 一起使用。我的端点之一可以上传文件。上传文件的定义方式(在 RestEasy 中)是提供一个 org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput
作为参数。
这是我的终点:
@PUT
@Path("/apis/{id}/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Registers a file.", code = 201, nickname = "registerFile")
@ApiResponses(
value = {
@ApiResponse(code = 201, message = "File created.",
response = FileCreated.class),
@ApiResponse(code = 400, message = "Invalid parameters."),
@ApiResponse(code = 404, message = "API is not found.")})
Response registerFile(
@ApiParam(value = "API ID.", required = true) @PathParam("id") String apiId,
@ApiParam(value = "File to register.", required = true, type = "file", name = "apiFile")
MultipartFormDataInput apiFile) throws AppException;
有什么问题?
不幸的是,swagger-ui 会根据 MultipartFormDataInput
的内部属性生成架构,而不是上传文件的按钮。
我尝试使用 @FormParam
注释(以指示提供的参数应被解释为文件)以及 MultipartFormDataInput
参数,但应用程序不想编译。
问题:swagger中有没有solution/workaround提供上传文件的按钮-ui?
解决方案是从您的 apiFile 参数中删除 @ApiParam
并在方法上方添加 @ApiImplicitParam
(未绑定到 Jax-RS 并允许手动定义参数):
@ApiImplicitParams({@ApiImplicitParam (value = "File to register.", required = true, dataType = "file", name = "apiFile", paramType="formData")})
最终解决方案
最终解决方案包括一个选定的答案,但我们应该添加 @ApiParam(hidden = true)
而不是删除 @ApiParam
。为什么?
如果我们删除@ApiParam
,则有两个字段:apiId
、body
以及MultipartFormDataInput
的内部属性和上传文件的按钮招摇-ui。这个 body
字段是一个副作用。要解决此问题,我们应该提供 @ApiParam(hidden = true)
,然后在 swagger-ui.
中有带有 apiId
的字段和上传文件的按钮
顺便说一句:我在 1.5.12 版本中测试了下面的 swagger-ui 代码。
@PUT
@Path("/apis/{id}/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Registers a file.", code = 201, nickname = "registerFile")
@ApiResponses(
value = {
@ApiResponse(code = 201, message = "File created.",
response = FileCreated.class),
@ApiResponse(code = 400, message = "Invalid parameters."),
@ApiResponse(code = 404, message = "API is not found.")})
@ApiImplicitParams(
@ApiImplicitParam(value = "File to register.", required = true, dataType = "file",
name = "apiFile", paramType = "formData"))
Response registerFile(
@ApiParam(value = "API ID.", required = true) @PathParam("id") String apiId,
@ApiParam(hidden = true) MultipartFormDataInput apiFile) throws AppException;
我将 JAX-RS (RestEasy) 与 Swagger 一起使用。我的端点之一可以上传文件。上传文件的定义方式(在 RestEasy 中)是提供一个 org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput
作为参数。
这是我的终点:
@PUT
@Path("/apis/{id}/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Registers a file.", code = 201, nickname = "registerFile")
@ApiResponses(
value = {
@ApiResponse(code = 201, message = "File created.",
response = FileCreated.class),
@ApiResponse(code = 400, message = "Invalid parameters."),
@ApiResponse(code = 404, message = "API is not found.")})
Response registerFile(
@ApiParam(value = "API ID.", required = true) @PathParam("id") String apiId,
@ApiParam(value = "File to register.", required = true, type = "file", name = "apiFile")
MultipartFormDataInput apiFile) throws AppException;
有什么问题?
不幸的是,swagger-ui 会根据 MultipartFormDataInput
的内部属性生成架构,而不是上传文件的按钮。
我尝试使用 @FormParam
注释(以指示提供的参数应被解释为文件)以及 MultipartFormDataInput
参数,但应用程序不想编译。
问题:swagger中有没有solution/workaround提供上传文件的按钮-ui?
解决方案是从您的 apiFile 参数中删除 @ApiParam
并在方法上方添加 @ApiImplicitParam
(未绑定到 Jax-RS 并允许手动定义参数):
@ApiImplicitParams({@ApiImplicitParam (value = "File to register.", required = true, dataType = "file", name = "apiFile", paramType="formData")})
最终解决方案
最终解决方案包括一个选定的答案,但我们应该添加 @ApiParam(hidden = true)
而不是删除 @ApiParam
。为什么?
如果我们删除@ApiParam
,则有两个字段:apiId
、body
以及MultipartFormDataInput
的内部属性和上传文件的按钮招摇-ui。这个 body
字段是一个副作用。要解决此问题,我们应该提供 @ApiParam(hidden = true)
,然后在 swagger-ui.
apiId
的字段和上传文件的按钮
顺便说一句:我在 1.5.12 版本中测试了下面的 swagger-ui 代码。
@PUT
@Path("/apis/{id}/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Registers a file.", code = 201, nickname = "registerFile")
@ApiResponses(
value = {
@ApiResponse(code = 201, message = "File created.",
response = FileCreated.class),
@ApiResponse(code = 400, message = "Invalid parameters."),
@ApiResponse(code = 404, message = "API is not found.")})
@ApiImplicitParams(
@ApiImplicitParam(value = "File to register.", required = true, dataType = "file",
name = "apiFile", paramType = "formData"))
Response registerFile(
@ApiParam(value = "API ID.", required = true) @PathParam("id") String apiId,
@ApiParam(hidden = true) MultipartFormDataInput apiFile) throws AppException;