【问题标题】:Customizing Request Header description in Swagger UI using Springfox-Swagger2使用 Springfox-Swagger2 在 Swagger UI 中自定义请求标头描述
【发布时间】:2017-07-09 23:20:21
【问题描述】:

我在我的 Spring Boot 应用程序中使用 Springfox Swagger2 2.4.0 版、Springfox Swagger UI 2.4.0 版和 Swagger Annotations 1.5.0 版。

这里的问题是,我能够为我的控制器的 API 生成 swagger UI,并且我能够对其进行测试。但我无法为我的请求标头指定请求标头描述。我正在使用 @RequestHeader 注释。

我的控制器 API 中的代码 sn-p 如下:

@RequestHeader(name = "Api-Key") String apiKey

请求头的Swagger UI如下:

图片中高亮的矩形区域代表请求头的描述。

目前它只是拾取 name 属性中提到的数据并显示它。但我想给出不同的描述。即“许可证密钥的值”

我如何在 Swagger UI 中实现这一点,因为 @RequestHeader 注释只有值、默认值、名称和必需的属性?任何帮助将不胜感激。

更新:寻找开箱即用的解决方案,无需我自己的任何自定义注释

【问题讨论】:

  • 不明白为什么这个问题被否决了两次?
  • 我完全按照描述与 RequestHeader 混淆了。 ApiParam(name, value, ..) 对我来说很有意义,并且 #value() 被明确描述为“描述”(在我的例子中是 io.swagger.annotations v2.9.2)。然而,@RequestHeader 的接口声明(在我的例子中是 spring-web.bind.annotations 5.0.12)声明 #value() 带有 AliasFor("name") 和 #name() 带有 AliasFor("value") 其中同时设置两者会导致渲染错误。这是一个错误还是应该反转 RequestHeader::value() 应该将模拟 ApiParam::value() 作为描述字段?

标签: spring-boot swagger swagger-ui swagger-2.0 springfox


【解决方案1】:

也许我的回答会对某人有所帮助。

正如his answer 中提到的Dilip Krishnan,您可以使用io.swagger.annotations.ApiParamio.swagger.annotations.ApiImplicitParam Swagger 注释来微调自定义文档。

@ApiParam 可用于注册的方法参数。

如果 API 参数没有显式注册,则可以使用@ApiImplicitParam

@RestController
@RequestMapping(value = "/v1/test", produces = "application/json")
@Api(value = "/v1/test")
public class TestController {

    @ApiOperation(value = "Do Something method", tags = "Test method")
    @RequestMapping(value = "/doSomeThing", method = RequestMethod.GET)
    public Foo doSomeThing(
            @ApiParam(value = "Param1 Description", required = true)
            @RequestParam String param) {
        throw new UnsupportedOperationException("do Some Things");
    }

    @ApiOperation(value = "Do Something Another method", tags = "Test method")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "anotherParam1", value = "Another Param1 Description", paramType = "header"),
            @ApiImplicitParam(name = "anotherParam1", value = "Another Param1 Description", paramType = "header")
    })
    @RequestMapping(value = "/doSomeThingAnother", method = RequestMethod.GET)
    public Foo doSomeThingAnother(Bar bar) {
        throw new UnsupportedOperationException("do Some Thing Another");
    }


}    

最后你可以看到下面的图片

【讨论】:

  • 我正在寻找在请求标头参数之上做的事情。不幸的是不是 api 隐式参数
  • 常规请求参数的描述已更新。
  • @ApiParam(value="header description") 可以与@RequestHeader 一起使用来提供标题描述。 @DmytroBoichenko 用这个更新答案。
  • @ChackoMathew 对不起,伙计,但目前我没有此代码,无法检查您的解决方案。
  • @DmytroBoichenko 我试过这种方式,但是当我调查浏览器工具的网络选项卡时,我看不到这个值作为标题发送。
【解决方案2】:

TL;DR 是您必须构建自己的插件才能做到这一点。

基本上,在这种情况下增加描述的唯一开箱即用注释是@ApiParam,更准确地说是@ApiImplicitParam。不幸的是,这些注释都不支持描述。

所以我的建议是:

  1. 创建您自己的注释,如下所示

    @RequestHeader(name = "Api-Key") @Description("Value of license key") String apiKey

注意:已经有一个适合此的annotation in spring

  1. 创建您自己的ParameterBuilderPlugin
  2. 如下图实现插件
public class Test implements ParameterBuilderPlugin {
  @Override
  public void apply(ParameterContext parameterContext) {
    ResolvedMethodParameter methodParameter =parameterContext.resolvedMethodParameter();
    Optional<Description> requestParam = methodParameter.findAnnotation(Description.class);
    if (requestParam.isPresent()) {
      parameterContext.parameterBuilder()
        .description(requestParam.get().value());
    }
  }

  @Override
  public boolean supports(DocumentationType documentationType) {
    return false;
  }
}
  1. 选择一个值the order 应用after swagger annotations 已处理。

另外请将您的 springfox 库升级到 latest version

【讨论】:

  • 感谢您的快速回复。不要对你所说的事情有太多的曝光,所以会尝试并回复你。再次感谢
  • 终于有时间开始做这个了。但是我一开始就被困住了,因为我对此还很陌生。正如您所提到的,我尝试将描述注释放置到我的请求标头参数中并得到一个错误,例如“注释类型不适用于这种声明”你能指导我吗?我还应该将测试类放在我的 Spring 应用程序代码中的帖子中吗?最后,我不太清楚您在第 4 步中的意思,请指教
  • 当您创建注释时,请确保它也适用于参数。使用弹簧随附的可能无法正常工作。第 4 步只是说确保您的插件在 swagger 插件之后运行。这些插件使用 springs 对 beans 进行排序。
【解决方案3】:

我们遇到了同样的问题,并通过以下方式解决了问题:

.. @RequestHeader(value = "..") @ApiParam(value = "Description") String param ..

这个想法是将“描述”字段添加到生成的招摇中。它可能看起来很老套,但它是一种快速简单的解决方案,对您的个人情况很有用。

【讨论】:

  • 猜猜会添加一个新参数而不更新标题描述
  • 是的,没错。如果目标只是大摇大摆,它可能会有所帮助。但一般情况下最好使用上述解决方案。
【解决方案4】:

快速、简单有效的解决方案是使用enum,例如:

@RequestHeader(value = "someval") ALLOWED_VALUES input

private enum ALLOWED_VALUES {A, B, C};

以下内容将大摇大摆地显示: 可用值:A, B, C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2017-11-06
    • 2017-04-09
    相关资源
    最近更新 更多