Springboot項(xiàng)目如何獲取所有的接口
更新時(shí)間:2021年09月11日 10:29:39 作者:小石潭記丶
這篇文章主要介紹了Springboot項(xiàng)目如何獲取所有的接口,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
Springboot項(xiàng)目獲取所有接口
@Autowired
private WebApplicationContext applicationContext;
@Override
public List getAllUrl() {
RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
// 獲取url與類和方法的對應(yīng)信息
Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) {
Map<String, String> map1 = new HashMap<String, String>();
RequestMappingInfo info = m.getKey();
HandlerMethod method = m.getValue();
//獲取當(dāng)前方法所在類名
Class<?> bean = method.getBeanType();
//使用反射獲取當(dāng)前類注解內(nèi)容
Api api = bean.getAnnotation(Api.class);
RequestMapping requestMapping = bean.getAnnotation(RequestMapping.class);
String[] value = requestMapping.value();
map1.put("parent",value[0])
//獲取方法上注解以及注解值
ApiOperation methodAnnotation = method.getMethodAnnotation(ApiOperation.class);
String privilegeName = methodAnnotation.notes();
PatternsRequestCondition p = info.getPatternsCondition();
for (String url : p.getPatterns()) {
map1.put("url", url);
}
map1.put("className", method.getMethod().getDeclaringClass().getName()); // 類名
map1.put("method", method.getMethod().getName()); // 方法名
RequestMethodsRequestCondition methodsCondition = info.getMethodsCondition();
for (RequestMethod requestMethod : methodsCondition.getMethods()) {
map1.put("type", requestMethod.toString());
}
list.add(map1);
}
return list;
}
獲取項(xiàng)目下所有http接口的信息
一、接口信息類
新建一個類用于存放http接口的相關(guān)信息
class RequestToMethodItem {
public String controllerName;
public String methodName;
public String requestType;
public String requestUrl;
public Class<?>[] methodParmaTypes;
public String getControllerName() {
return controllerName;
}
public void setControllerName(String controllerName) {
this.controllerName = controllerName;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getRequestUrl() {
return requestUrl;
}
public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
public Class<?>[] getMethodParmaTypes() {
return methodParmaTypes;
}
public void setMethodParmaTypes(Class<?>[] methodParmaTypes) {
this.methodParmaTypes = methodParmaTypes;
}
public RequestToMethodItem(String requestUrl, String requestType, String controllerName, String requestMethodName, Class<?>[] methodParmaTypes){
this.requestUrl = requestUrl;
this.requestType = requestType;
this.controllerName = controllerName;
this.methodName = requestMethodName;
this.methodParmaTypes = methodParmaTypes;
}
}
二、單元測試
寫兩個http接口用于測試
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@GetMapping(value = "/test1")
@ResponseBody
public void test1(Integer a) {
}
@PostMapping(value = "/test2")
@ResponseBody
public void test2(Integer a,Integer b) {
}
}
測試單元
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import cn.hutool.json.JSONUtil; //hutool是一個很方便的工具包
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
WebApplicationContext applicationContext;
@org.junit.Test
public void index() {
List<RequestToMethodItem> requestToMethodItemList = new ArrayList<RequestToMethodItem>();
RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods
.entrySet()) {
RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();
RequestMethodsRequestCondition methodCondition = requestMappingInfo.getMethodsCondition();
PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();
// 請求類型
String requestType = methodCondition.getMethods().toString();
// 請求路徑
String requestUrl = patternsCondition.getPatterns().iterator().next();
// 控制器名稱
String controllerName = mappingInfoValue.getBeanType().toString();
// 請求方法名
String requestMethodName = mappingInfoValue.getMethod().getName();
// 請求參數(shù)
Class<?>[] methodParamTypes = mappingInfoValue.getMethod().getParameterTypes();
// Spring通過BasicErrorController進(jìn)行統(tǒng)一的異常處理,不計(jì)入這些API
if("class org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController".equals(controllerName)) {
continue;
}
RequestToMethodItem item = new RequestToMethodItem(requestUrl, requestType, controllerName,
requestMethodName, methodParamTypes);
requestToMethodItemList.add(item);
}
System.out.println(JSONUtil.toJsonStr(requestToMethodItemList));
}
}
測試結(jié)果

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳談spring中bean注入無效和new創(chuàng)建對象的區(qū)別
這篇文章主要介紹了spring中bean注入無效和new創(chuàng)建對象的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java線程讓步_動力節(jié)點(diǎn)Java學(xué)院整理
yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級的等待線程獲取執(zhí)行權(quán)。下面通過本文給大家介紹Java線程讓步的相關(guān)知識,需要的朋友參考下吧2017-05-05

