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

OpenApi 如何从资源文件添加示例 @RequestBody -> @Content -> @Schema -> 示例

宗政浩慨
2023-03-14

我正在开发一个基于服务的应用程序,为此我添加了基于的openapi注释,例如@RequestBody、@Parameter、@Schema,在@模式.我有一个示例字段,可以为其提供字符串格式的示例模板。

我已经提供了示例JSON字符串,但JSON内容非常丰富,因此我想从我的参考资料文件夹中的。但我目前无法加载它。有人能告诉我如何从文件而不是字符串中添加示例内容吗?

我试着查找,发现有一个字段<code>externalValue</code>但我无法理解如何使其工作。以下是文档的链接。

下面是我的代码,它运行得非常好:

@Path("/generate")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@RequestBody(description = "InputTemplate body",
        content = @Content(schema = @Schema(implementation = InputTemplate.class, example = "{\n" +
                "  \"names\":[\n" +
                "    \"Batman\",\n" +
                "    \"Superman\",\n" +
                "    \"Ironman\"\n" +
                "  ],\n" +
                "  \"jobs\":[\n" +
                "    \"Fighting\",\n" +
                "    \"Fyling\",\n" +
                "    \"Teching\"\n" +
                "  ]\n" +
                "}")))
public Multi<String> generate(final Map<String, Object> input) throws CustomException {
        
}

我想用我的< code>resources文件夹中的外部文件的内容替换< code>example中的JSON内容。

在尝试了许多事情之后,我知道我需要使用< code>@ExampleObject,但是如果我添加了相应的注释并尝试打开我的< code>Swagger UI,那么我就不能获得我添加的文件的内容。相反,它为我提供了来自< code>InputTemplate.class的数据

以下是修改后的代码:

@RequestBody(description = "InputTemplate body",
        content = @Content(schema = @Schema(implementation = InputTemplate.class), examples = {
                @ExampleObject(name = "Example-1",
                        description = "Example-1 for InputTemplate.",
                        ref = "#/resources/Example1.json"), externalValue = "#/resources/Example2.json"
                @ExampleObject(name = "Example-2",
                        description = "Example-2 for InputTemplate.",
                        ref = "#/resources/Example1.json") //externalValue = "#/resources/Example1.json"
        }))

我试图调查一个类似的问题,但提供的回答对我不起作用:

  1. 如何在SpringDoc OpenAPI3中的折射文件?
  2. https://github.com/springdoc/springdoc-openapi/issues/1432
  3. https://github.com/springdoc/springdoc-openapi/issues/17

共有1个答案

于正志
2023-03-14

据我所知,ref值似乎期望一个可以找到模式的url?我看到有人建议创建一个endpoint来返回示例?这对我来说似乎有点过分。。。

我决定最简单的事情就是添加一些东西来从文件中提取示例并将它们插入OpenApi对象。

我在Spring配置中实现了OpenApiCustomiser,这允许我指向应用程序资源文件夹中的文件以获取响应示例。

我这样注释Controller方法

@ApiResponses(value = {
    @ApiResponse(responseCode = "200",
        content = { @Content(mediaType = "application/json", 
        schema = @Schema(implementation = SomeResponse.class, 
                  name = "YourResponse"),  
                  examples = {@ExampleObject(value = "@your_data_200_response.json")}) }) 
    })

要使上述内容正常工作,请添加以下 OpenApiCustomiser 配置 bean:

@Bean
public OpenApiCustomiser applyStandardOpenAPIModifications() {
    return openApi -> {
        Paths paths = new Paths();
        openApi.getPaths().entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .forEach(stringPathItemEntry -> {
                    paths.addPathItem(stringPathItemEntry.getKey(), addExamples(stringPathItemEntry.getValue()));
                });
        openApi.setPaths(paths);
    };
}

private PathItem addExamples(PathItem pathItem) {
    if(pathItem.getPost() !=null)  {
        //Note you can also Do this to APIResponses to insert info from a file into examples in say, a 200 response.
            pathItem.getPost().getRequestBody().getContent().values().stream()
                    .forEach(c ->{
                        String fileName = c.getExample().toString().replaceFirst("@","");
                        ObjectNode node = null;
                        try {
                            //load file from where you want. also don't insert is as a string, it wont format properly
                            node = (ObjectNode) new ObjectMapper().readTree(methodToReadInFileToString(fileName)); 
                        } catch (JsonProcessingException e) {
                            throw new RuntimeException(e);
                        }
                        c.setExample(node);
                    }
            );
    }
    return pathItem;
}

我只是从包含. json文件的 /resources文件夹中加载文件。

 类似资料:
  • 我正试图将示例响应值添加到我的springdoc-openapi swagger文档中。 比如用“马克吐温”代替“字符串”等。 我尝试使用这个解决方案-springdoc openapi:如何添加POST请求示例? 我已经在课堂上使用了。 如果我使用这个- @io.swagger.v3.oas.annotations.parameters.RequestBody(内容=@Content(示例={@

  • 问题内容: 我通过Java程序读取的路径中有hibernate.cfg.xml和test.txt。现在,当我使用maven创建jar时,这些文件不存在。所以我读到我应该放在资源文件夹中,所以现在我的目录结构是 scr->主要-> Java 现在我可以看到jar中的文件,但是它们根本不在资源文件夹中 myjar.jar-> com(源代码) 我尝试使用访问 getClass()。getResourc

  • 有没有一种方法可以对OpenAPI 3规范进行同样的操作? codekie/swagger-examples-validator 目前只支持 OpenAPI 2。 有没有人知道一个简单的方法来对照模式检查所有的例子?

  • 我的Symfony 4应用程序中有一个APIendpoint,我想用NelmioApiDocBundle和Swagger记录它。endpoint将JSON作为请求数据,并返回一些自定义JSON作为响应。如何使用注释将其示例添加到文档中?我在文档页面上看不到任何示例,只有描述。

  • 我的服务提供XML文件的上传。OpenApi规范没有指定模式。我想提供一个输入示例。我试试这个: 然而,大摇大摆的用户界面产生了无用的结果: 是否可以从外部文件中指定示例?

  • 问题内容: 我的项目具有以下结构: 我有一个文件,我想从单元测试中加载文件 我有此代码不起作用。它抱怨“没有这样的文件或目录”。 我也试过了 这也不起作用。它返回。我正在使用Maven构建我的项目。 问题答案: 尝试下一个: 如果上述方法不起作用,则已在以下类中添加了各种项目:1(代码在此处)。 以下是有关如何使用该类的一些示例: