Hi ~ 小老弟开始转公众号啦,欢迎大家来指点迷津呀
这种方式需要在 jar 里面也要引入swagger依赖,再将 jar 集成到具体项目中的时候,可能会引起关于swagger的依赖冲突。
因此选择用反射方式构建swagger,去除jar中对swagger的依赖~
关于动态feign调用的,可以参考这里~ 关于动态创建Feign Client的问题
首先在方法入口的时候先取得swagger的相关class,放进缓存中。对于没有使用swagger的项目,直接简单处理。
private static final String API_CLASS = "apiClass";
private static final String API_OPERATION_CLASS = "apiOperationClass";
private static final Map<String, Class<Annotation>> API_CLASS_CACHE = new ConcurrentHashMap<>(8);
private boolean prepareSwaggerClass() {
boolean result = false;
try {
API_CLASS_CACHE.put(API_CLASS, (Class<Annotation>) Class.forName("io.swagger.annotations.Api"));
API_CLASS_CACHE.put(API_OPERATION_CLASS , (Class<Annotation>) Class.forName("io.swagger.annotations.ApiOperation"));
result = true;
} catch (ClassNotFoundException e) {
LOGGER.error("Swagger class not found.........");
}
return result;
}
方法入口:(根据上一篇文章修改:SpringBoot项目获取所有的接口请求信息)
public List<Map<String, Object>> getUrl() {
// 此处省略...
boolean swagger = prepareSwaggerClass();
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : handlerMethods.entrySet()) {
Map<String, Object> map = new HashMap<>(16);
if (swagger) {
map.putAll(getSwaggerProperties(entry.getValue()));
} else {
map.put("requestName", entry.getValue().getMethod().getName());
map.put("remark", "");
}
//此处省略...
}
API_CLASS_CACHE.clear();
return list;
}
核心更改:
private Map<String, Object> getSwaggerProperties(HandlerMethod handlerMethod) {
Map<String, Object> map = new HashMap<>(16);
String requestName = "";
String remark = "";
try {
Class<?> declaringClass = handlerMethod.getMethod().getDeclaringClass();
// 类名上的注释
Class<Annotation> apiClass = API_CLASS_CACHE.get(API_CLASS );
Annotation api = declaringClass.getAnnotation(apiClass);
if (declaringClass.isAnnotationPresent(apiClass) && Objects.nonNull(api)) {
Object apiValue = apiClass.getDeclaredMethod("value").invoke(api);
requestName = null == apiValue ? requestName : String.valueOf(apiValue);
}
// 接口
Class<Annotation> apiOperationClass = API_CLASS_CACHE.get(API_OPERATION_CLASS );
Annotation apiOperation = handlerMethod.getMethodAnnotation(apiOperationClass);
if (handlerMethod.hasMethodAnnotation(apiOperationClass) && Objects.nonNull(apiOperation)) {
// 接口方法描述
Object apiOperationValue = apiOperationClass.getDeclaredMethod("value").invoke(apiOperation);
requestName = ObjectUtils.isEmpty(requestName) ? String.valueOf(apiOperationValue) : requestName + "_" + apiOperationValue;
// 接口方法补充描述
Object apiOperationNotes = apiOperationClass.getDeclaredMethod("notes").invoke(apiOperation);
remark = ObjectUtils.isEmpty(apiOperationNotes) ? "" : String.valueOf(apiOperationNotes);
} else {
requestName = ObjectUtils.isEmpty(requestName) ? handlerMethod.getMethod().getName() : requestName + "_" + handlerMethod.getMethod().getName();
}
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
requestName = handlerMethod.getMethod().getName();
LOGGER.error("Collect swagger information error.........");
}
map.put("requestName", requestName);
map.put("remark", remark);
return map;
}
吧啦吧啦搞事情完毕 - -
关于动态feign调用的,可以参考这里~ 关于动态创建Feign Client的问题