代码之家  ›  专栏  ›  技术社区  ›  Shadowman

OpenAPI/Swagger UI注释和BeanParam

  •  0
  • Shadowman  · 技术社区  · 7 年前

    我正在使用Quarkus开发一组JAX-RS服务。我还使用OpenAPI/Swagger UI注释对它们进行注释,以方便生成API文档。我能够注释我的 GET

        @Path("/{communityIdentifier}")
        @GET
        @Operation(summary = "Get community details", description = "Get detailed information about a community")
        @APIResponses({
                @APIResponse(responseCode = "200", description = "The community details", content = @Content(schema = @Schema(ref = "community"))),
                @APIResponse(name = "401", responseCode = "401", description = "Authentication required"),
                @APIResponse(name = "403", responseCode = "403", description = "Permission denied - you do not have access to access this resource", content = @Content(schema = @Schema(ref = "baseError"))),
                @APIResponse(name = "404", responseCode = "404", description = "Resource not found", content = @Content(schema = @Schema(ref = "baseError"))),
                @APIResponse(name = "500", responseCode = "500", description = "Internal service error", content = @Content(schema = @Schema(ref = "baseError"))) })
        @Timed(name = "getCommunityTimer")
        @Counted(name = "getCommunityCount")
        public Response getCommunity(
                @PathParam("securityRealm") @Parameter(name = "securityRealm", description = "The security realm name", required = true) String securityRealmName,
                @PathParam("communityIdentifier") @Parameter(name = "communityIdentifier", description = "The community identifier", required = true) String communityIdentifier) {
     // Stuff
    }
    

    当我访问我的Swagger UI端点时,我看到了这个服务的文档条目,包括 securityRealm communityIdentifier 参数。现在我正在努力创造 POST PUT 方法,我遇到了一个问题。

    自从我的 放置 / 岗位 请求包含许多表单参数,我将它们封装到一个对象中,并用 @BeanParam . 我的窗体对象如下所示:

    public class CommunityRequestForm extends AbstractRequestForm {
    
        private static final long serialVersionUID = 6007695645505404656L;
    
        @FormParam("description")
        private String description = null;
    
        @FormParam("name")
        private String name = null;
    
        public String getDescription() {
            return description;
        }
    
        public String getName() {
            return name;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    我的 岗位 方法如下所示:

        @Path("/")
        @POST
        @Consumes({ MediaType.APPLICATION_FORM_URLENCODED })
        @Operation(summary = "Create a community", description = "Creates a new community within a security realm")
        @APIResponses({
                @APIResponse(responseCode = "201", description = "The community details", content = @Content(schema = @Schema(ref = "community"))),
                @APIResponse(name = "401", responseCode = "401", description = "Authentication required"),
                @APIResponse(name = "403", responseCode = "403", description = "Permission denied - you do not have access to access this resource", content = @Content(schema = @Schema(ref = "baseError"))),
                @APIResponse(name = "404", responseCode = "404", description = "Resource not found", content = @Content(schema = @Schema(ref = "baseError"))),
                @APIResponse(name = "500", responseCode = "500", description = "Internal service error", content = @Content(schema = @Schema(ref = "baseError"))) })
        public Response createCommunity(
                @PathParam("securityRealm") @Parameter(name = "securityRealm", description = "The security realm name", required = true) String securityRealmName,
                @BeanParam CommunityRequestForm communityForm) {
      // Stuff
    }
    

    到目前为止,一切顺利。然而,我一直不知道如何注释 name description

    @FormParam("description")
    @Parameter(name = "description", required = true, style = ParameterStyle.FORM)
    private String description = null;
    

    那没用。我尝试将我的方法签名更改为如下所示:

    public Response createCommunity(
                @PathParam("securityRealm") @Parameter(name = "securityRealm", description = "The security realm name", required = true) String securityRealmName,
                @Parameter(style = ParameterStyle.FORM) @BeanParam CommunityRequestForm communityForm)
    

    还是没什么。我的问题是,有没有办法让OpenAPI/Swagger UI注释能够很好地发挥作用并记录 @BeanParam公司 注释对象?还是根本不支持这种方法?

    0 回复  |  直到 7 年前
        1
  •  0
  •   Guillaume Smet    7 年前

    我知道他们用这个PR改进了SmallRye OpenAPI 1.1.5中的所有内容: https://github.com/smallrye/smallrye-open-api/pull/138 .

    Quarkus 0.22.0仍使用1.1.3。我们已经在master中更新到1.1.8,因此即将发布的0.23.0将有更新。

    您可以尝试使用Quarkus主分支(只需使用 mvn clean install -DskipTests -DskipITs 然后将版本更改为 999-SNAPSHOT ). 希望情况会好转。