当前位置:   article > 正文

Swagger使用介绍三之为Controller中参数添加JSONObject类型字段说明_swagger jsonobject

swagger jsonobject
  • 回顾

上文中我们介绍了如果给Controller中的参数添加字段说明:https://blog.csdn.net/shangcunshanfu/article/details/100838687,也留下了一个问题,那就是如何给JSONObject类型的参数添加字段说明,本章就来进行介绍

  • 说明

Swagger其实是没有针对JSONObject添加字段说明功能的,这也很好理解,因为Swagger并没有义务为jackson或是fastjson或是其它json序列化工具添加一个专门的字段说明功能。要对JSONObject类型参数添加字段说明,本人自行编写了一个Swagger的扩展包,用于提供该功能。

 

    1. 下载源码包

下载地址https://github.com/ShangCunShanFu/swagger-extension。

下载完成后,打包并引入自己的工程中。

在配置文件中添加如下配置:

hgd11-swagger:
  baseControllerPackage: 换成controller包的要目录
    1. 使用方法
      1. @Hgd11SwaggerModel

该注解用来对实体进行说明,类似于Swagger提供的@ApiModel。用法如下:

  1. @Hgd11SwaggerModel(description = "测试Hgd11SwaggerModel实体说明", index = "hgd11TestEntity",
  2.     properties = @Hgd11SwaggerProperties(value = {
  3.         @Hgd11SwaggerProperty(
  4.             name = "id",
  5.             index = "userId",
  6.             description = "用户ID",
  7.             dataType = "integer",
  8.             required = true,
  9.             example = "1"),
  10.         @Hgd11SwaggerProperty(
  11.             name = "name",
  12.             index = "userName",
  13.             description = "用户姓名",
  14.             dataType = "String",
  15.             example = "wangkaige"), }))
  16. @PostMapping("/form")
  17. @ApiOperation("测试Hgd11SwaggerModel")
  18. public JSONObject Hgd11SwaggerModel(){
  19.     return new JSONObject();
  20. }

代码5.1

该注解中有一个description属性,值 为”测试hgd11SwaggerModel实体说明”,该属性就是对一个实体的说明。在真实开发中,该值可以是”用户说明”、”部门说明”等。

在Swagger页面上效果如下:

 

图5. 1

从图5.1可以看出,实现了与图1.1相同的效果

      1. @Hgd11SwaggerProperties及@Hgd11SwaggerProperty注解

对JSONObject实体里需要封装的字段进行说明。

以代码5.1及图5.1为例,代码中添加了两个字段,“id”,“name”,在图5.1中也得到了字段相应的说明,其字段类型及是否必传也体现了出来

      1. @Hgd11SwaggerParameter

当JSONObject或是Map类型实体作为参数时,对实体中的字段作说明。

  1. @PostMapping("/hgd11SwaggerParameter")
  2. public TestEntity hgd11SwaggerParameterTest(
  3.     @Hgd11SwaggerParameter(description = "测试Hgd11SwaggerParameter实体说明",model = @Hgd11SwaggerModel(description = "测试Hgd11SwaggerModel实体说明", index = "hgd11TestEntity",
  4.         properties = @Hgd11SwaggerProperties(value = {
  5.             @Hgd11SwaggerProperty(
  6.                 name = "id",
  7.                 index = "userId",
  8.                 description = "用户ID",
  9.                 dataType = "integer",
  10.                 required = true,
  11.                 example = "1"),
  12.             @Hgd11SwaggerProperty(
  13.                 name = "name",
  14.                 index = "userName",
  15.                 description = "用户姓名",
  16.                 dataType = "String",
  17.                 example = "wangkaige"), })))
  18.     JSONObject param
  19.     
  20. ){
  21.     return new TestEntity();
  22. }

代码5.2

代码中有一个名为param的JSONObject实体作为接口的参数,当在该参数是添加了@Hgd11SwaggerParameter注解以后,就表示该实体拥有了id,name两个属性。在Swagger中的展现如下:

 

图5. 2

可以看到,在注解中为实体添加的两个字段成功的展现在了Swagger页面上

@Hgd11SwaggerParameter里面封装了@Hgd11SwaggerModel注解。

      1. @Hgd11SwaggerModelRef及@Hgd11SwaggerParameterRef

当在Controller中已经使用@Hgd11SwaggerModel定义了某个实体的时候,再次使用到该实体时,可使用@Hgd11SwaggerModelRef引用之前定义过的实体。如果要把之前的实体引用作为参数,则配合使用@Hgd11SwaggerParameterRef即可。代码如下:

  1. @Hgd11SwaggerModelRef(ref = "hgd11TestEntity")
  2. @ApiOperation("测试Ref")
  3. @PostMapping("/hgd11SwaggerModelRef")
  4. public JSONObject hgd11SwaggerModelRef(
  5.     @Hgd11SwaggerParameterRef(
  6.         description = "测试Hgd11SwaggerParameterRef实体说明",
  7.         model = @Hgd11SwaggerModelRef(
  8.             ref = "hgd11TestEntity")) JSONObject param) {
  9.     return new JSONObject();}

代码5.3

在代码5.3中使用了@Hgd11SwaggerModelRef注解及@Hgd11SwaggerParameterRef注解。这两个注解都只有一个属性,那就是ref,当需要引用某一个已定义的实体时,将已存在实体的index属性赋予ref即可。如代码5.3中的”hgd11TestEntity”。

 

图5. 3

从图5.3可以看出,传参及响应,都成功对参数进行了说明

      1. 实体当中存在子级

为处理实体中存在子级结构的问题,在@Hgd11SwaggerProperty注解中,有一个属性叫“children”。该属性是一个数组,在该处指定子级结构即可。代码如下:

  1. @PostMapping("/hgd11SwaggerParameter")
  2. @ApiOperation("测试hgd11SwaggerParameter")
  3. public TestEntity hgd11SwaggerParameterTest(
  4.     @Hgd11SwaggerParameter(description = "测试Hgd11SwaggerParameter实体说明",
  5.         model = @Hgd11SwaggerModel(description = "测试Hgd11SwaggerModel实体说明",
  6.             index = "hgd11TestEntityChild",
  7.         properties = @Hgd11SwaggerProperties(value = {
  8.             @Hgd11SwaggerProperty(
  9.                 name = "id",
  10.                 index = "userId",
  11.                 description = "用户ID",
  12.                 dataType = "integer",
  13.                 required = true,
  14.                 example = "1"),
  15.             @Hgd11SwaggerProperty(
  16.                 name = "dept",
  17.                 index = "userDept",
  18.                 description = "用户所在部门",
  19.                 children = {"deptId","deptName"}),
  20.             @Hgd11SwaggerProperty(
  21.                 name = "id",
  22.                 index = "deptId",
  23.                 description = "部门ID",
  24.                 dataType = "integer",
  25.                 required = true,
  26.                 example = "1"),
  27.             @Hgd11SwaggerProperty(
  28.                 name = "name",
  29.                 index = "deptName",
  30.                 description = "部门名称",
  31.                 dataType = "String",
  32.                 required = true,
  33.                 example = "开发部"),
  34.         })))
  35.     JSONObject param
  36. ){
  37.     return new TestEntity();
  38. }

代码5.4

代码中index=userDept的属性,有一个子级,该子级有两个属性,deptId及deptName。然后再定义两个index=deptId及index=deptName的属性,即可完成子级结构的创建。

需要注意的是,进行属性之间子级关系绑定的,是index属性,而不是name属性。不同属性之间name属性可以重名,但index属性的值必须唯一。完成后Swagger页面的效果如下:

 

图5. 4

从图5.4即可明显看出子级结构的存在。

这样的作法让接口上的注解看起来很臃肿,其实这是有必要的,可是不必去担心和纠结的。当使用Swagger的@ApiModel注解时,也需要定义相同多的参数说明。只不过这些说明被放在了某一个类中进行,并没有体现在Controller的接口上而已。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/897682
推荐阅读
相关标签
  

闽ICP备14008679号