当前位置:   article > 正文

Swagger2接口文档返回json、map等对象的介绍说明出参_swagger 返回参数

swagger 返回参数

一、遇到问题

目前使用Swagger2形成接口文档时,当系统设计的接口返回的类型不是实体对象时,Swagger2无法在接口文档页面中显示返回结果字段说明,比如返回json、map等可以存储key-val形式的类型;均无法在接口文档页面上显示返回的字段备注说明,所以怎么才能像实体对象一样显示正常的model字段说明是我们这次需要解决的问题;

二、实现思路

1、首先告诉Swagger2该接口需要返回的字段具体有哪些

定义两个注解,方便来定义返回json或者map的固定参数;如:

  1. /**
  2. * @ClassName: ApiReturnJson
  3. * @Description: 返回对象的定义 (描述这个类的作用)
  4. * @author TangCai
  5. * @date 2019年2月22日 下午4:56:33
  6. */
  7. @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
  8. @Retention(RetentionPolicy.RUNTIME)
  9. public @interface ApiReturnJson {
  10. String key(); //对象名称
  11. ApiReturnJsonPro[] value(); //对象属性值
  12. }
  1. /**
  2. * @ClassName: ApiReturnJsonPro
  3. * @Description: 每一个字段的定义备注说明 (描述这个类的作用)
  4. * @author TangCai
  5. * @date 2019年2月22日 下午4:57:09
  6. */
  7. @Target(ElementType.METHOD)
  8. @Retention(RetentionPolicy.RUNTIME)
  9. public @interface ApiReturnJsonPro {
  10. String key(); //key
  11. String example() default "";
  12. Class<?> dataType() default String.class;
  13. String description() default "";
  14. }

 

2、在Swagger2中将该字段封装成一个model存进Swagger2容器中,继承OperationModelsProviderPlugin类,实现如下方法:

  1. public void apply(RequestMappingContext context) {
  2. // TODO Auto-generated method stub
  3. if (context.getReturnType().isInstanceOf(Map.class)) {
  4. // 根据参数上的ApiJsonObject注解中的参数动态生成Class
  5. Optional<ApiReturnJson> optional = context.findAnnotation(ApiReturnJson.class);
  6. ApiReturnJsonPro[] properties = null;
  7. String name = null;
  8. try {
  9. Method method = Swagger2.class.getMethod("restApi");//系统默认取该处的全局变量
  10. ApiReturnJson apiReturnJson = method.getAnnotation(ApiReturnJson.class);
  11. name = apiReturnJson.key()+"_"+context.getName();
  12. ApiReturnJsonPro[] properties0 = apiReturnJson.value();
  13. if (optional.isPresent()) {
  14. name = optional.get().key(); // model名称
  15. ApiReturnJsonPro[] properties1 = optional.get().value();
  16. properties = new ApiReturnJsonPro[properties1.length+properties0.length];
  17. int k=0;
  18. for(;k<properties0.length;k++) properties[k] = properties0[k];
  19. for(int p=0;p<properties1.length;p++) properties[k+p] = properties1[p];
  20. }
  21. else properties = properties0;
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. ResolvedType rt = typeResolver.resolve(createRefModel(properties, name));
  26. // 像documentContext的Models中添加我们新生成的Class
  27. context.getDocumentationContext().getAdditionalModels().add(rt);
  28. context.operationModelsBuilder().addReturn(rt).build();
  29. }
  30. }

 

3、然后在每一个生成的接口在BuilderPlugin进行解析,并将访问正常的model更新,将json、map等替换,继承OperationBuilderPlugin类,实现如下方法:

  1. public void apply(OperationContext operationContext) {
  2. // TODO Auto-generated method stub
  3. if(operationContext.getReturnType().isInstanceOf(Map.class)) {
  4. //根据参数上的ApiJsonObject注解中的参数动态生成Class
  5. Optional<ApiReturnJson> optional = operationContext.findAnnotation(ApiReturnJson.class);
  6. try {
  7. Method method = Swagger2.class.getMethod("restApi");//系统默认取该处的全局变量
  8. ApiReturnJson apiReturnJson = method.getAnnotation(ApiReturnJson.class);
  9. String name = apiReturnJson.key()+"_"+operationContext.getName();
  10. if (optional.isPresent())
  11. name = optional.get().key(); //model 名称
  12. Set<ResponseMessage> set = new HashSet<ResponseMessage>();
  13. ModelRef mr = new ModelRef(name);
  14. set.add(new ResponseMessage(200,"返回json用例说明",mr,null,null));
  15. operationContext.operationBuilder().responseMessages(set);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }

 

三、运行结果

注解样式:

  1. @ApiOperation(value = "获取上传文件表单name值")
  2. @ApiImplicitParams({
  3. @ApiImplicitParam(paramType="query", name = "uploadFileType", value = "上传文件类型:saveHeadImg", required = true, dataType = "string",defaultValue="")
  4. })
  5. @ApiReturnJson(key = "getUploadFileUrl_api", value = {
  6. @ApiReturnJsonPro(key = "uploadFileNamesVal", description = "上传文件表单name值")
  7. })
  8. @GetMapping("/getUploadFileUrl")
  9. @ResponseBody
  10. public Result getUploadFileUrl(@RequestParam(required=true)String uploadFileType) {
  11. AssertUtil.assertNotFalse(MyConstants.CONFIG.UPLOAD_FILE_TYPES.containsKey(uploadFileType), MyConstants.RESULT.FI1000, "uploadFileType非法");
  12. String res = HttpUtil.httpGet(MyConstants.CONFIG.GET(SysParamKey.FILE_SYSTEM_AUTH_CODE_URL).toString());
  13. Result result = (Result) JSONObject.toBean(JSONObject.fromObject(res), Result.class);
  14. result.put("uploadFileNamesVal", MyConstants.CONFIG.UPLOAD_FILE_TYPES.get(uploadFileType));
  15. return result;
  16. }

接口页面结果:

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

闽ICP备14008679号