SpingCloud集成Swagger
实现SwaggerResourcesProvider接口,组装SwaggerResource
/**
* @program: robin
* <p>
* *** 注释仅供参考,具体以代码为准 ***
* @description: TODO
* @author: AuthZz authzz@163.com
* @create: 2021/1/12 下午2:27
* @Version: 1.0
**/
@Component
@Primary
public class RobinSwaggerResourcesProvider implements SwaggerResourcesProvider {
@Resource
private DiscoveryClient discoveryClient;
@Resource
private LoadBalancerClient loadBalancerClient;
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
discoveryClient.getServices().stream().forEach(serviceId -> {
ServiceInstance selectedInstance = loadBalancerClient.choose(serviceId);
if (selectedInstance != null) {
SwaggerResource resource = swaggerResource(serviceId, "/api-docs/" + serviceId);
resources.add(resource);
}
});
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion("2.0");
return swaggerResource;
}
}
构建controller获取各个swagger资源
/**
* @program: robin
* <p>
* *** 注释仅供参考,具体以代码为准 ***
* @description: TODO
* @author: AuthZz authzz@163.com
* @create: 2021/1/12 下午3:10
* @Version: 1.0
**/
@Api(tags = "Swaager测试")
@RestController
@RequestMapping("/api-docs")
public class SwaggerController {
@Resource
private LoadBalancerClient loadBalancerClient;
private RestTemplate restTemplate = new RestTemplate();
@ApiIgnore
@GetMapping(value = "{serviceId}", produces = {"application/json", "application/hal+json"})
public ResponseEntity<HashMap<String, Object>> processSwaggerRequest(@PathVariable("serviceId") String serviceId,
HttpServletRequest request) {
ServiceInstance selectedInstance = loadBalancerClient.choose(serviceId);
if (selectedInstance != null) {
URI serviceURI = selectedInstance.getUri();
String documentationUri = serviceURI.toString() + "/v2/api-docs";
ResponseEntity<HashMap<String, Object>> swaggerResponse = restTemplate.exchange(documentationUri,
HttpMethod.GET, null, new ParameterizedTypeReference<HashMap<String, Object>>() {});
HashMap<String, Object> swagger = swaggerResponse.getBody();
swagger.put("host", "");
swagger.put("basePath", "/" + serviceId);
return new ResponseEntity<>(swagger, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
}
出处:https://www.zhihu.com/question/58954233