Swagger UI不支持为RestEasy

时间:2017-07-06 13:46:34

标签: jax-rs swagger multipartform-data resteasy swagger-ui

我使用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中上传文件?

2 个答案:

答案 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,则会有两个字段:apiIdbody,其中包含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;