SwaggerProvider.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package org.ssssssss.magicapi.swagger;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. import org.ssssssss.magicapi.config.MappingHandlerMapping;
  6. import org.ssssssss.magicapi.model.ApiInfo;
  7. import org.ssssssss.magicapi.provider.GroupServiceProvider;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Objects;
  12. /**
  13. * 生成swagger用的json
  14. */
  15. public class SwaggerProvider {
  16. private MappingHandlerMapping mappingHandlerMapping;
  17. /**
  18. * 描述信息
  19. */
  20. private String description;
  21. /**
  22. * 标题
  23. */
  24. private String title;
  25. /**
  26. * 版本号
  27. */
  28. private String version;
  29. /**
  30. * 基础路径
  31. */
  32. private String basePath;
  33. private GroupServiceProvider groupServiceProvider;
  34. public void setMappingHandlerMapping(MappingHandlerMapping mappingHandlerMapping) {
  35. this.mappingHandlerMapping = mappingHandlerMapping;
  36. }
  37. public void setGroupServiceProvider(GroupServiceProvider groupServiceProvider) {
  38. this.groupServiceProvider = groupServiceProvider;
  39. }
  40. public void setDescription(String description) {
  41. this.description = description;
  42. }
  43. public void setTitle(String title) {
  44. this.title = title;
  45. }
  46. public void setVersion(String version) {
  47. this.version = version;
  48. }
  49. public void setBasePath(String basePath) {
  50. this.basePath = basePath;
  51. }
  52. @ResponseBody
  53. public SwaggerEntity swaggerJson() {
  54. List<ApiInfo> infos = mappingHandlerMapping.getApiInfos();
  55. SwaggerEntity swaggerEntity = new SwaggerEntity();
  56. SwaggerEntity.License license = new SwaggerEntity.License("MIT", "https://gitee.com/ssssssss-team/magic-api/blob/master/LICENSE");
  57. swaggerEntity.setInfo(new SwaggerEntity.Info(this.description, this.version, this.title, license));
  58. swaggerEntity.setBasePath(this.basePath);
  59. ObjectMapper mapper = new ObjectMapper();
  60. for (ApiInfo info : infos) {
  61. String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
  62. String requestPath = "/" + mappingHandlerMapping.getRequestPath(info.getGroupId(), info.getPath());
  63. SwaggerEntity.Path path = new SwaggerEntity.Path();
  64. path.addTag(groupName);
  65. boolean hasBody = false;
  66. try {
  67. List<SwaggerEntity.Parameter> parameters = parseParameters(mapper, info);
  68. hasBody = parameters.stream().anyMatch(it -> "body".equals(it.getIn()));
  69. parameters.forEach(path::addParameter);
  70. path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), "{}"), Object.class));
  71. } catch (Exception ignored) {
  72. }
  73. if(hasBody){
  74. path.addConsume("application/json");
  75. }else{
  76. path.addConsume("*/*");
  77. }
  78. path.addProduce("application/json");
  79. path.setSummary(StringUtils.defaultIfBlank(info.getDescription(), info.getName()));
  80. swaggerEntity.addPath(requestPath, info.getMethod(), path);
  81. }
  82. return swaggerEntity;
  83. }
  84. private List<SwaggerEntity.Parameter> parseParameters(ObjectMapper mapper, ApiInfo info) {
  85. List<SwaggerEntity.Parameter> parameters = new ArrayList<>();
  86. info.getParameters().forEach(it-> parameters.add(new SwaggerEntity.Parameter(it.getName(),"query","string",it.getDescription(),it.getValue())));
  87. info.getHeaders().forEach(it-> parameters.add(new SwaggerEntity.Parameter(it.getName(),"header","string",it.getDescription(),it.getValue())));
  88. try {
  89. Object object = mapper.readValue(info.getRequestBody(),Object.class);
  90. if(object instanceof List || object instanceof Map){
  91. parameters.add(new SwaggerEntity.Parameter("body", "body", object instanceof List ? "array": "object", null, object));
  92. }
  93. } catch (Exception ignored) {
  94. }
  95. return parameters;
  96. }
  97. }