gpt4 book ai didi

spring - Swagger 从属性文件中读取文档

转载 作者:行者123 更新时间:2023-12-01 21:52:26 25 4
gpt4 key购买 nike


我试图让 Swagger 从属性文件 swagger.properties 中读取 API 文档,但不能。在 @ApiOperation 注释中有一个错误提示:Attribute value must be constant。关于如何解决此问题并能够从属性文件中读取文档的任何建议?
这是 Controller 代码:

package com.demo.student.demo.controller;

import com.demo.student.demo.entity.Student;
import com.demo.student.demo.service.StudentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/v1/students")
@Api(description = "Set of endpoints for Creating, Retrieving, Updating and Deleting of Students.")
public class StudentController {
private final String message;

public StudentController(@Value("${test.swagger.message}") String message){
this.message=message;
}

@Autowired
private StudentService studentService;

@GetMapping
@ApiOperation(message)
public List<Student> findAll(){
return studentService.findAl();
}

}

另外,我如何在@API(description) 中的类级别注入(inject)一个值?

最佳答案

有一个解决方法。但是你需要一个额外的依赖 - springfox

您可以编写一个插件,将来自外部文件的文本注入(inject)到您的 @ApiOperation description 字段中。我在我的项目中使用它来注入(inject) Markdown 文件。它非常方便,因为 Swagger 支持 markdown,并且每个端点都有一个单独的文件,让您有机会编写大量的 API 描述(如果您使用的是 IntelliJ IDEA 或类似工具,也可以在 markdown 编辑器中)。

这是您需要的代码:

  1. 为您要提供描述的每个端点自定义注释 (@ApiDescription)。注释的值将是您的 Markdown 文件或属性文件的文件路径。稍后插件将在提供的文件路径中查找文件并将描述设置为文件的内容。

    @Target({ ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApiDescription {
    String value() default "";
    }
  2. 插件本身。它是一个扩展点。在这种情况下,我们希望稍后交换或设置 @ApiOperation 注释的描述值。查看Springfox Plugins .

    ...

    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spi.service.OperationBuilderPlugin;
    import springfox.documentation.spi.service.contexts.OperationContext;
    import springfox.documentation.spring.web.DescriptionResolver;

    ...

    @Component
    public class ApiDescriptionPlugin implements OperationBuilderPlugin {

    private final DescriptionResolver resolver;

    @Autowired
    public ApiDescriptionPlugin(DescriptionResolver resolver) {
    this.resolver = resolver;
    }

    @Override
    public void apply(OperationContext context) {

    Optional<ApiDescription> descOptional = context.findAnnotation(ApiDescription.class);
    boolean hasText = descOptional.isPresent() && StringUtils.hasText(descOptional.get().value());
    if(!hasText) {
    return;
    }

    final String file = descOptional.get().value();
    final URL url = Resources.getResource(file);

    String description;
    try {
    description = Resources.toString(url, StandardCharsets.UTF_8);
    } catch(IOException e) {
    log.error("Error while reading markdown description file {}", file, e);
    description = String.format("Markdown file %s not loaded", file);
    }
    context.operationBuilder().notes(resolver.resolve(description));
    }

    @Override
    public boolean supports(DocumentationType type) {
    return true;
    }
    }
  3. 简单地用@ApiDescription("/notes/auth/login.md")注释端点(文件必须在resources文件夹)

您可以调整此示例以使用属性文件(我不知道您的结构是什么样子以及您如何分隔不同的 API 描述)。这种使用 markdown 文件的解决方法对于编写大量描述并使它们远离实际代码很有用。

它适用于 Swagger 2.0

试一试。

关于spring - Swagger 从属性文件中读取文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58998687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com