当前位置: 首页 > 知识库问答 >
问题:

Swagger声明模式=@模式(实现=Map.class)将模式表示为swagger-ui中的字符串

南宫凡
2023-03-14

我正在尝试创建springdocswagger文档,我想表示一个数据类型为Map的请求主体

方法声明

        @Operation(security = {@SecurityRequirement(name = "bearer-key")}, summary = "Create Data", operationId = "createData", description = "Create createData for the **`type`**. ")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "201", description = "Data created", content = @Content(schema = @Schema(implementation = Map.class),
                    examples = {@ExampleObject(value = "{\n" +
                            "    \"id\": \"927d810c-3ac5-4584-ba58-7c11befabf54\",\n" +
                            "}")})),
            @ApiResponse(responseCode = "400", description = "BAD Request")})
    @PostMapping(value = "/data/type", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
    @io.swagger.v3.oas.annotations.parameters.RequestBody(content = @Content(schema = @Schema(implementation = Map.class),
            examples = {@ExampleObject(value = "{\n" +
                    "            \"label\":\"tourism\",\n" +
                    "            \"location\":\"France\"\n" +
                    "         }")}))
    ResponseEntity<Map<String, Object>> createData(@Parameter(name = "type", required = true) @PathVariable("type") String type, @Parameter(name = "request payload") @Valid @RequestBody Map<String, Object> body);

但是我想以一种更容易理解的方式向引用我的API的客户机展示模式。我可以看到,在Github中存在一个没有适当解决方案的关闭票据。根据我的要求,请求主体应该是一个类型无关的动态键值对,因此除了以Map的形式接收请求之外,没有其他方法


共有3个答案

奚翰海
2023-03-14

为了忽略SpringMVC支持的其他可注入参数,这是springdoc openapi库的默认行为。

  • https://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/web.html#mvc-ann-arguments

如果你想改变这种行为,你可以如下所示:

    SpringDocUtils.getConfig().removeRequestWrapperToIgnore(Map.class);
薛墨一
2023-03-14

分享我的工作方法的问题,我已经做了一个变通方法为@io.swagger.v3.oas.annotations.parameters.请求体(内容=@内容(模式=@模式(实现=Map.class)模式来作为字符串问题。

我在OpenAPI bean声明中声明了一个名为Map的自定义模式,如下所示

new OpenAPI()
                .components(new Components()
                        .addSchemas("Map", new Schema<Map<String, Object>>().addProperties("< * >", new ObjectSchema())
                        ))
                    .....
                    .....

并在模式声明中使用上述模式,如下所示

 @io.swagger.v3.oas.annotations.parameters.RequestBody(
            content = @Content(mediaType = APPLICATION_JSON_VALUE, 
                 schema = @Schema(ref = "#/components/schemas/Map"))

上述方法可用于代替ApiResponse,如下所示

 @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200",
            content = @Content(mediaType = APPLICATION_JSON_VALUE, 
                 schema = @Schema(ref = "#/components/schemas/Map"))

注意:如果我们使用上述自定义模式方法,我们不需要更改或忽略任何类型,其中SpringDoc内部使用。

尚安平
2023-03-14

我有一个APIendpoint,请求体需要一个HashMap。关于如何修复“示例值”问题的信息不多。普拉桑的回答让我找到了正确的地方。我张贴我的解决方案的完整性,但所有的功劳归他所有。(附言:我试图支持他的回答,但我没有足够的“分数”)

配置方面:

@Configuration
@OpenAPIDefinition
public class DocsConfiguration {
    @Bean
    public OpenAPI customOpenAPI() {
        Schema newUserSchema = new Schema<Map<String, Object>>()
                .addProperties("name",new StringSchema().example("John123"))
                .addProperties("password",new StringSchema().example("P4SSW0RD"))
                .addProperties("image",new StringSchema().example("https://robohash.org/John123.png"));

        return new OpenAPI()
                //.servers(servers)
                .info(new Info()
                        .title("Your app title")
                        .description("App description")
                        .version("1.0")
                        .license(new License().name("GNU/GPL").url("https://www.gnu.org/licenses/gpl-3.0.html"))
                )
                .components(new Components()
                        .addSchemas("NewUserBody" , newUserSchema)
                );
    }
}

控制器端:

    @io.swagger.v3.oas.annotations.parameters.RequestBody(
            content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                    schema = @Schema(ref = "#/components/schemas/NewUserBody")))
    @PostMapping("/v1/users")
    public Response<User> upsertUser(@RequestBody HashMap<String,Object> user) {
         //Your code here
    }
 类似资料:
  • 我正在使用swagger ui,试图标准化API文档。我意识到,对于使用主体参数因而需要显示模型和模型模式的动词(GET、PUT、POST等),模式是在资源级别定义的(在pet store示例中为/pet或/store)。然而,在我们的API中,所需的主体参数将随着动词的变化而变化,最好为每个动词建立一个模型来准确反映这一点。 中模型定义的当前版本http://petstore.swagger.w

  • 我正在尝试为Swagger中的项目获取模型模式。我想通过一个http请求来实现这一点,该请求来自不同于托管Swagger的机器。 我可以从以下位置获取作为json的Swagger API文档: 该响应包含: 是否有任何方法获取“/definitions/Item”模型模式? 我想做一个http获取,比如: 我使用的是Swagger 2.0版。 谢谢

  • 我使用springdoc-openapi-用户界面为Spring启动API留档,并面临以下问题- 我添加了所有必要的配置,如下所示- maven依赖- 使用java版本11,不确定问题出在哪里,项目无法运行。

  • 我正在使用Springdoc来记录我在Spring Boot中制作的REST API。我需要从Swagger UI的模式部分隐藏一些模型/模式,这些模型/模式只在应用编程接口内部使用,所以没有必要在模式部分显示它们。 这是我试图隐藏的模型之一: 上图所示模型的超类: 这些示例中的大多数注释都来自JPA或Lombok。需要明确的是:在Schemas部分不可见–我在这里包括它只是为了以防万一。 到目前

  • 我尝试使用swagger来描述JSON API。到目前为止,它看起来不错,但我无法弄清楚如何使用anyOf结构在JSON答案中定义不同对象类型的数组。 以下JSOn模式是有效的,它应该描述一组文章和视频JSON对象: 有没有可能在摇摆不定中使这项工作发挥作用?

  • 我想知道您是否可以在hasNext(字符串模式)中指定要扫描的内容。例如,我想检索正在扫描的行的前三个字符。那么有没有办法指定诸如 在这里我要抓取该行的前3个字母字符。