SpringBoot获取所有类名,接⼝名,注解值
需求
近来项⽬中有个新需求,审计记录中除了⽤户的访问地址还需要包含事件具体描述,项⽬是集成了swagger的,开发时接⼝上都
⽤@ApiOperation写了接⼝说明,出于偷懒的⼼理尝试了⼀波根据url反向查类名,接⼝名,注解值,尝试之后甚是觉得不偷懒的搬砖⼯⼀定不是好的泥⽔匠。。。
实现思路
项⽬加载时获取所有的Controller类 - 路径 - 接⼝名 - 接⼝说明 - 接⼝发布说明到系统全局变量
⽇志记录时根据url获取接⼝发布说明
实现代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.t.ServletContextAware;
import org.hod.HandlerMethod;
import org.springframework.web.dition.PatternsRequestCondition;
import org.springframework.web.dition.RequestMethodsRequestCondition;
import org.springframework.web.hod.RequestMappingInfo;
import org.springframework.web.hod.annotation.RequestMappingHandlerMapping;
import com.tbtechmon.utils.StringUtils;
import io.swagger.annotations.ApiOperation;
@Service
public class InitUrlService implements InitializingBean, ServletContextAware{
public static List<HashMap<String, String>> urlList = new ArrayList<HashMap<String, String>>();
@Autowired
private RequestMappingHandlerMapping requestMappingHandlerMapping;
/**
* 获取url与类和⽅法的对应信息
*/
@Override
public void setServletContext(ServletContext servletContext) {
Map<RequestMappingInfo, HandlerMethod> handlerMethodsMap = HandlerMethods();
for (Map.Entry<RequestMappingInfo, HandlerMethod> item : Set()) {
HashMap<String, String> model = new HashMap<String, String>();
RequestMappingInfo info = Key();
HandlerMethod method = Value();
PatternsRequestCondition p = PatternsCondition();
for (String url : p.getPatterns()) {
model.put("url", url); //路径
}
model.put("className", Method().getDeclaringClass().getName()); // 类名
ApiOperation apiOperation = MethodAnnotation(ApiOperation.class);
if(apiOperation != null) {
model.put("apiOperationValue", apiOperation.value()); //接⼝说明
model.put("apiOperationnotes", s()); //接⼝发布说明
}
RequestMethodsRequestCondition methodsCondition = MethodsCondition();
String type = String();
if (type != null && type.startsWith("[") && dsWith("]")) {
type = type.substring(1, type.length() - 1);springframework和springboot
model.put("type", type); // ⽅法请求类型
}
urlList.add(model);
}
System.out.println("----反向加载URL完成----");
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
}
/**
* 通过访问IP获取访问⽅法信息
* @param lookupPath
* @return
*/
public HashMap<String, String> findUrlByUrlList(String lookupPath){
for(HashMap<String, String> item : urlList) {
String url = OrDefault("url", "");
if(!StringUtils.isBlank(url) && url.equals(lookupPath)) {
return item;
}
}
return null;
}
}
在插⼊操作记录的地⽅取出对应的url信息即可HashMap<String, String> urlItem = initUrlService.findUrlByUrlList(url); String apiOperationnotes = OrDefault("apiOperationnotes", "") .end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论