我使用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-ui中上传文件?
答案 0 :(得分:1)
解决方法是从apiFile参数中删除@ApiParam
并在方法上方添加@ApiImplicitParam
(不绑定到Jax-RS并允许手动定义参数):
@ApiImplicitParams({@ApiImplicitParam (value = "File to register.", required = true, dataType = "file", name = "apiFile", paramType="formData")})
答案 1 :(得分:0)
最终解决方案包含选定的答案,但我们不应删除@ApiParam
,而应添加@ApiParam(hidden = true)
。为什么呢?
如果我们移除@ApiParam
,则会有两个字段:apiId
,body
,其中包含MultipartFormDataInput
的内部属性,以及用于在文件中上传文件的按钮 - UI。此body
字段是副作用。要解决此问题,我们应该提供@ApiParam(hidden = true)
,然后是apiId
字段和用于在swagger-ui上传文件的按钮。
BTW:我在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;