@ApiOperation(value = "dubbo泛化調用工具接口") public Result dubboApiTool( @ApiParam(value = "interfaceName", defaultValue = "com.shop.api.ShopService") @Param(value = "interfaceName", required = true) String interfaceName, @ApiParam(value = "methodName", defaultValue = "loadShopByCode") @Param(value = "methodName", required = true) String methodName, @ApiParam(value = "接口入參列表", defaultValue = "[]") @Json(value = "methodParams", array = Object.class, defaultValue = "[]") List<Object> methodParams, HttpServletRequest request) throws ClassNotFoundException { // 校驗登錄 Result checkLoginResult = CommonUtil.loginAuthVerify(request); if (!checkLoginResult.isSuccess()) { log.error("未登錄用戶無權限執行此操作"); return checkLoginResult; } if (!OptimusConfig.getValue("TOOL_API_OPERATORS_MOBILES") .contains(((Principal) checkLoginResult.getData()).getUserPhone())) { return Result.fail("401", "當前用戶無操作權限"); } ApplicationConfig application = new ApplicationConfig(); application.setName("api-generic-consumer-zjt"); RegistryConfig registry = new RegistryConfig(); registry.setAddress(OptimusConfig.getValue("dubbo.registry.address", "zookeeper://stable.zk.scsite.net:2181")); application.setRegistry(registry); ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); // 弱類型接口名 reference.setInterface(interfaceName); // 聲明為泛化接口 reference.setGeneric(true); reference.setApplication(application); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用 GenericService genericService = reference.get(); /** * GenericService 這個接口只有一個方法,名為 $invoke,它接受三個參數,分別為方法名、方法參數類型數組和參數值數組; * 對於方法參數類型數組 如果是基本類型,如 int 或 long,可以使用 int.class.getName()獲取其類型; 如果是基本類型數組,如 * int[],則可以使用 int[].class.getName(); 如果是 POJO,則直接使用全類名,如 * com.alibaba.dubbo.samples.generic.api.Params。 */ //全部方法 Method[] methods = Class.forName(interfaceName).getMethods(); Method method = Arrays.stream(methods).filter(m -> methodName.equalsIgnoreCase(m.getName()) && methodParams.size()==m.getParameterTypes().length) .findFirst().get(); Class[] params = method.getParameterTypes(); List<String> paramNameList = Arrays.stream(params).map(p -> p.getName()).collect(Collectors.toList()); Map map = (Map) genericService.$invoke(methodName, paramNameList.toArray(new String[paramNameList.size()]), methodParams.toArray(new Object[methodParams.size()])); return Result.success(new JSONObject(map).toJSONString()); }