如何用资源链接替换Swagger的枚举?

时间:2016-06-01 12:50:01

标签: java rest swagger dropwizard jsonschema

我从the documentation知道我可以这样注释我的POJO:

@ApiModelProperty(value = "pet status in the store", allowableValues = "available,pending,sold")
public String getStatus() {
    return status;
  }

产生类似的东西:

"properties": {
        ...,
        "status": {
          "type": "string",
          "description": "pet status in the store",
          "enum": [
            "available",
            "pending",
            "sold"
          ]
        }
      }

图片现在实现方法:

@ApiModelProperty(value = "pets in the store")
public Set<String> getPets() {
    return pets;
  }

返回商店中可用的宠物列表。例如,有一天它可能是["cats", "dogs", "songbirds"],然后当鸣禽售罄时只有["cats", "dogs"]

我的API实际上有一个端点来获取宠物列表:

http://petShop.foo/pets

而不是使用allowableValues = "cats, dogs, songbirds", 我想指定一个Swagger注释 该字段必须包含给定端点返回的值。就是这样:

@ApiModelProperty(value = "pets in the store", allowableValues = "/pets")
public Set<String> getPets() {...}

这是为了让我的客户端/前端知道在发出请求时可以使用哪些值, 例如,在线购买宠物。如果我有"enum": ["cats", "dogs", ..]

,我究竟该怎么做

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  • Fork Swagger
  • processAllowedValues类中扩展方法io.swagger.util.ParameterProcessor以使用除逗号分隔值之外的Enum类。 (目前它仅支持逗号分隔值和范围)
  • 在构建Web应用程序时使用Swagger的自定义变体

但是,使用此方法,您需要继续维护Swagger的分支。

答案 1 :(得分:0)

Java注释是一种语法元数据。它在编译期间被处理并且(如果在其上指定了@Retention(RetentionPolicy.RUNTIME))在运行期间可用于反射访问。因此,在运行时没有直接的解析或设置方法!

然而,Java中有一种方法可以实现您想要的 - 但它有点过于复杂(并且使用了一些未记录的功能!)。方法如下:

  • 创建自定义注释ApiModelProperty(带有@Retention(RetentionPolicy.COMPILE)的注释) - 这将充当@ApiModelProperty
  • 的包装器
  • 为上面的注释编写注释处理器类(它必须从javax.annotation.processing.AbstractProcessor类扩展)
  • 在您的注释处理器中,注入 @ApiModelProperty的值从您的Enum读取(这部分相当复杂,因为您需要遍历{{1}的AST获取允许的值)

Project Lombok就是一个很好的例子。它操纵Java的抽象语法树以在Java中添加新功能。

it's source codeEnum下,请看一下:

  • lombok.javac.handlers方法,了解如何在编译时添加注释。 (使用HandleConstructor.addConstructorProperties
  • com.sun.tools.javac.tree.JCAnnotation方法,了解如何阅读 literal 值。

您还可以查看本教程:Creating Custom Transformations