用昂首阔步隐藏api模特的本性

时间:2017-03-08 14:43:41

标签: java rest swagger

我目前有几个共享公共对象的API。在某些情况下,我想在生成swagger文档时隐藏这些公共对象的某些属性。例如,我们说我有一个简单的课程:

public class Person {
  private String forename;
  private String surname;
  private int age;

  /* getters and setters with annotations here... */
}

对于某些API,我希望age字段出现在swagger文档中,但在其他API中我不会。

我不想使用hidden注释的@ApiModelProperty属性,因为这会隐藏所有API的属性。我可以看到有一个access属性可以用于我自己的扩展SwaggerSpecFilter的过滤器类。

如何通过实现此接口的isPropertyAllowed方法来实现此目的?在该方法中似乎没有任何参数可以用来找出哪个Api正在使用Model和property。

1 个答案:

答案 0 :(得分:2)

我设法通过让所有API类都有一个“过滤器”类来实现这一点,该类将添加/删除/编辑API模型中的任何属性,如下所示:

public class MyApiFilter implements SwaggerFilterIF {

@Override
public void filter(Swagger swagger) {
  Map<String, Model> definitions = swagger.getDefinitions();

  // remove 'age' from 'Person'
  Model model = definitions.get("Person");
  model.getProperties().remove("age");
}

然后在API类中引用它:

@Api
@Path("/myapi")
public class MyApi implements SwaggerApiIF {
  public MyApi () {
    super();
  }

  @Override
  public SwaggerFilterIF getFilter() {
    return new MyApiFilter();
  }
}

然后我有一个servlet来为我可以单独访问的每个API生成API文档。在这个servlet中,我在API的'Filter'类中调用filter方法,它将根据需要过滤swagger定义:

for (final SwaggerApiIF api : apis) {
  final Swagger swagger = new Reader(new Swagger(), config).read(api.getClass());
  api.getFilter().filter(swagger);
}