前端只请求这一个接口,入参是 3 参数,id就是请求路径 , 前端同一个接口, 然后 Id 值变化 请求到后端不同的接口去
id: apkApi.createChannel
redirect: app
param: {"apiVersion":"1.0.0","partnerNo":"dddd"}
用反射实现
@RestController
@RequestMapping("/api")
@Slf4j
public class FinanceBizActionController {
@PostMapping("/financeBizAction.do")
public ResultEntity<Object> financeBizAction( @RequestBody FinanceBizActionReq req) throws Exception {
Method method = HASH_MAP.get(req.getId());
Object param = JSON.parseObject(req.getParam(), method.getParameterTypes()[0].getDeclaredConstructor().newInstance().getClass());
Object invoke = method.invoke(method.getDeclaringClass().getDeclaredConstructor().newInstance(), param);
return ResultBuilder.ok(invoke, "");
}
}
将所有的请求路径缓存到map中,系统启动就会加载 该方法
@Component
@Slf4j
public class UrlConversionHandler {
public static final HashMap<String, Method> HASH_MAP = new HashMap<>();
@PostConstruct
public void handle() {
log.info("开始加载数据");
//扫描这个包下所有被@RestController注解修饰的类
Reflections reflections = new Reflections("com.controller");
Set<Class<?>> restController = reflections.getTypesAnnotatedWith(RestController.class);
//遍历这些类
restController.forEach(aClass -> {
//获取类中所有的方法
Method[] methods = aClass.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
//获取类和方法中的一些信息
String path1 = "";
String path2 = "";
if (aClass.isAnnotationPresent(RequestMapping.class)) {
path1 = aClass.getAnnotation(RequestMapping.class).value()[0].replace("/", "");
}
if (methods[i].isAnnotationPresent(PostMapping.class)) {
path2 = methods[i].getAnnotation(PostMapping.class).value()[0].replace("/", "");
}
//拼接得到的访问该方法的路径
String url = path1 + "." + path2;
HASH_MAP.put(url, methods[i]);
}
});
log.info("开始加载数据完成{}",HASH_MAP);
}
}