diff --git a/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/controller/GrpcDocController.java b/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/controller/GrpcDocController.java index 126d5ddf..500cd7dd 100644 --- a/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/controller/GrpcDocController.java +++ b/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/controller/GrpcDocController.java @@ -1,6 +1,7 @@ package com.zyplayer.doc.grpc.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.nxest.grpc.client.GrpcChannelFactory; import com.nxest.grpc.server.GrpcService; @@ -31,6 +32,8 @@ public class GrpcDocController { @Resource GrpcChannelFactory grpcChannelFactory; + private static Map allColumnsMap = new HashMap<>(); + private static Map allBlockingStubMap = new HashMap<>(); @RequestMapping("/service") public DocResponseJson service() throws Exception { @@ -48,14 +51,8 @@ public class GrpcDocController { // 找所有的参数列表 Map columnsMap = new HashMap<>(); for (GrpcDocInfo grpcDocInfo : grpcDocInfoList) { - String paramType = grpcDocInfo.getParamType(); - String resultType = grpcDocInfo.getResultType(); - if (!columnsMap.containsKey(paramType)) { - columnsMap.put(paramType, this.findColumnInfo(paramType)); - } - if (!columnsMap.containsKey(resultType)) { - columnsMap.put(resultType, this.findColumnInfo(resultType)); - } + this.setColumnsInfo(grpcDocInfo.getParamType(), columnsMap); + this.setColumnsInfo(grpcDocInfo.getResultType(), columnsMap); } GrpcServiceAndColumn grpcServiceAndColumn = new GrpcServiceAndColumn(); grpcServiceAndColumn.setServiceList(grpcDocInfoList); @@ -68,40 +65,48 @@ public class GrpcDocController { List grpcDocInfoList = this.getDefinitionByJar(Class.forName(service)); String executeResult = "执行失败"; if (grpcDocInfoList != null && grpcDocInfoList.size() > 0) { - Map paramMap = JSON.parseObject(params, new TypeReference>() {}); + JSONObject paramMap = JSON.parseObject(params); executeResult = this.executeFunction(grpcDocInfoList.get(0), paramMap); } return executeResult; } - private String executeFunction(GrpcDocInfo grpcDocInfo, Map paramMap) throws Exception { - Class aClass = Class.forName(grpcDocInfo.getParamType()); - Method getMoney = aClass.getMethod("newBuilder"); - Object newBuilder = getMoney.invoke(aClass); - - List setterFunction = this.getSetterFunction(newBuilder.getClass()); - for (MethodParam methodParam : setterFunction) { - if (!Const.BASE_TYPE.contains(methodParam.getType())) { - Method setName = newBuilder.getClass().getMethod(methodParam.getSetterName(), Class.forName(methodParam.getType())); - Object paramObj = paramMap.get(methodParam.getName()); - if (paramObj != null) { - newBuilder = setName.invoke(newBuilder, paramObj); - } + private void setColumnsInfo(String typeName, Map columnsMap) { + if (!columnsMap.containsKey(typeName)) { + if (allColumnsMap.containsKey(typeName)) { + columnsMap.put(typeName, allColumnsMap.get(typeName)); + } else { + ColumnInfo columnInfo = this.findColumnInfo(typeName); + columnsMap.put(typeName, columnInfo); + allColumnsMap.put(typeName, columnInfo); } } - + } + + private String executeFunction(GrpcDocInfo grpcDocInfo, JSONObject paramMap) throws Exception { + Object newBuilder = this.createParamBuilder(grpcDocInfo.getParamType(), paramMap); + if (newBuilder == null) { + return "组装参数失败"; + } + // 创建参数对象 Method build = newBuilder.getClass().getMethod("build"); Object request = build.invoke(newBuilder); - - Class serviceClass = Class.forName(grpcDocInfo.getService()); - String serviceSuperName = serviceClass.getSuperclass().getName(); - String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$")); - - Class superClass = Class.forName(superClassName); - Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class); - Object blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel()); - + System.out.println(request.toString()); + // 为创建过则创建 + Object blockingStub = allBlockingStubMap.get(grpcDocInfo.getService()); + if (blockingStub == null) { + // 找到父类 + Class serviceClass = Class.forName(grpcDocInfo.getService()); + String serviceSuperName = serviceClass.getSuperclass().getName(); + String superClassName = serviceSuperName.substring(0, serviceSuperName.indexOf("$")); + // 注册 + Class superClass = Class.forName(superClassName); + Method newBlockingStubMethod = superClass.getMethod("newBlockingStub", Channel.class); + blockingStub = newBlockingStubMethod.invoke(null, grpcChannelFactory.createChannel()); + allBlockingStubMap.put(grpcDocInfo.getService(), blockingStub); + } Method sayHello = blockingStub.getClass().getMethod(grpcDocInfo.getMethod(), Class.forName(grpcDocInfo.getParamType())); + // 执行请求 Object response = sayHello.invoke(blockingStub, request); // Method messageMethod = response.getClass().getMethod("getMessage"); @@ -112,6 +117,36 @@ public class GrpcDocController { return response.toString(); } + private Object createParamBuilder(String paramType, JSONObject paramMap) { + try { + Class aClassSub = Class.forName(paramType); + Method newBuilderMethod = aClassSub.getMethod("newBuilder"); + Object newBuilder = newBuilderMethod.invoke(aClassSub); + List functionTemp = this.getSetterFunction(newBuilder.getClass()); + for (MethodParam paramTemp : functionTemp) { + Class baseTypeClass = Const.BASE_TYPE.get(paramTemp.getType()); + if (baseTypeClass != null) { + Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), baseTypeClass); + Object paramObjTemp = paramMap.getObject(paramTemp.getName(), baseTypeClass); + if (paramObjTemp != null) { + newBuilder = setNameSub.invoke(newBuilder, paramObjTemp); + } + } else { + Class typeClassSub = Class.forName(paramTemp.getType()); + Object newBuilderSub = this.createParamBuilder(paramTemp.getType(), paramMap); + Method build = newBuilderSub.getClass().getMethod("build"); + Object request = build.invoke(newBuilderSub); + Method setNameSub = newBuilder.getClass().getMethod(paramTemp.getSetterName(), typeClassSub); + newBuilder = setNameSub.invoke(newBuilder, request); + } + } + return newBuilder; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + private String toLowerCaseFirstOne(String str) { if (Character.isLowerCase(str.charAt(0))) { return str; @@ -174,7 +209,7 @@ public class GrpcDocController { ColumnInfo info = new ColumnInfo(); info.setType(param.getType()); info.setName(param.getName()); - if (!Const.BASE_TYPE.contains(param.getType())) { + if (!Const.BASE_TYPE.containsKey(param.getType())) { List classColumn = this.findClassColumns(Class.forName(param.getType())); info.setParam(classColumn); } diff --git a/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/framework/consts/Const.java b/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/framework/consts/Const.java index 2db31e8e..3fec6d53 100644 --- a/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/framework/consts/Const.java +++ b/zyplayer-doc-grpc/src/main/java/com/zyplayer/doc/grpc/framework/consts/Const.java @@ -3,30 +3,28 @@ package com.zyplayer.doc.grpc.framework.consts; import com.google.protobuf.ByteString; import java.math.BigDecimal; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; +import java.util.*; public class Const { - public static final Set BASE_TYPE; + public static final Map> BASE_TYPE; static { - BASE_TYPE = new HashSet<>(); - BASE_TYPE.add(String.class.getName()); - BASE_TYPE.add(Integer.class.getName()); - BASE_TYPE.add(Long.class.getName()); - BASE_TYPE.add(Double.class.getName()); - BASE_TYPE.add(Date.class.getName()); - BASE_TYPE.add(Byte.class.getName()); - BASE_TYPE.add(Float.class.getName()); - BASE_TYPE.add(BigDecimal.class.getName()); - BASE_TYPE.add(ByteString.class.getName()); + BASE_TYPE = new HashMap<>(); + BASE_TYPE.put(String.class.getName(), String.class); + BASE_TYPE.put(Integer.class.getName(), Integer.class); + BASE_TYPE.put(Long.class.getName(), Long.class); + BASE_TYPE.put(Double.class.getName(), Double.class); + BASE_TYPE.put(Date.class.getName(), Date.class); + BASE_TYPE.put(Byte.class.getName(), Byte.class); + BASE_TYPE.put(Float.class.getName(), Float.class); + BASE_TYPE.put(BigDecimal.class.getName(), BigDecimal.class); + BASE_TYPE.put(ByteString.class.getName(), ByteString.class); - BASE_TYPE.add(char.class.getName()); - BASE_TYPE.add(int.class.getName()); - BASE_TYPE.add(long.class.getName()); - BASE_TYPE.add(double.class.getName()); - BASE_TYPE.add(byte.class.getName()); - BASE_TYPE.add(float.class.getName()); + BASE_TYPE.put(char.class.getName(), char.class); + BASE_TYPE.put(int.class.getName(), int.class); + BASE_TYPE.put(long.class.getName(), long.class); + BASE_TYPE.put(double.class.getName(), double.class); + BASE_TYPE.put(byte.class.getName(), byte.class); + BASE_TYPE.put(float.class.getName(), float.class); } } diff --git a/zyplayer-doc-grpc/src/main/resources/doc-grpc.html b/zyplayer-doc-grpc/src/main/resources/doc-grpc.html index a9b04e19..b7332b5e 100644 --- a/zyplayer-doc-grpc/src/main/resources/doc-grpc.html +++ b/zyplayer-doc-grpc/src/main/resources/doc-grpc.html @@ -47,10 +47,10 @@ - {{dubboInfo.paramColumn}} +
- {{dubboInfo.resultColumn}} +
@@ -74,25 +74,7 @@ - - - - - - - - - - - - - - - - - +
@@ -157,6 +139,7 @@ searchKeywords: "", docParamList: [], docParamRequestList: [], + paramColumnRequest: "", // 参数类型选项 paramTypeOptions: [{ value: 'java.lang.String' @@ -214,9 +197,12 @@ var resultColumn = app.columnMap[grpcInfo.resultType]; grpcInfo.method = method; grpcInfo.function = path; - grpcInfo.paramColumn = this.columnToJsonString(paramColumn || {}); - grpcInfo.resultColumn = resultColumn || {}; grpcInfo.docInfo = {}; + var paramColumnTemp = this.columnToJsonString(paramColumn || {}); + app.paramColumnRequest = JSON.stringify(paramColumnTemp, null, 4); + grpcInfo.paramColumn = this.processObjectToHtmlPre(paramColumnTemp); + var resultColumnTemp = this.columnToJsonString(resultColumn || {}); + grpcInfo.resultColumn = this.processObjectToHtmlPre(resultColumnTemp); // 清空再赋值才会重新渲染 app.dubboInfo = {}; app.dubboInfo = grpcInfo; @@ -230,9 +216,7 @@ columnToJsonString(columns){ var param = {}; if(!!columns.param && columns.param.length > 0) { - param[columns.name] = this.columnArrToJsonString(columns.param); - } else { - param[columns.name] = "";//columns.type; + param = this.columnArrToJsonString(columns.param); } return param; }, @@ -344,41 +328,37 @@ var fuc = app.dubboInfo.function; var service = fuc.substring(0, fuc.lastIndexOf(".")); var method = fuc.substring(fuc.lastIndexOf(".") + 1, fuc.length); - var paramTypes = []; - var params = []; - for (var i = 0; i < app.docParamList.length; i++) { - var item = app.docParamList[i]; - if (isNotEmpty(item.paramType) && isNotEmpty(item.paramValue)) { - paramTypes.push(item.paramType); - params.push(item.paramValue); - } - } + var paramColumnRequest = JSON.stringify(JSON.parse(app.paramColumnRequest)); var param = { service: service, method: method, - paramTypes: JSON.stringify(paramTypes), - params: "{}",//JSON.stringify(params), + params: paramColumnRequest,//JSON.stringify(params), }; app.requestResult = ""; app.onlineDebugLoading = true; ajaxTemp("zyplayer-doc-grpc/execute", "post", "json", param, function (json) { app.onlineDebugLoading = false; if (json.errCode == 200) { - try { - app.requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(json.data), 0, false, false, false, false); - } catch (e) { - try { - app.requestResult = Formatjson.processObjectToHtmlPre(json.data, 0, false, false, false, false); - } catch (e) { - app.requestResult = json.data; - } - } + app.requestResult = app.processObjectToHtmlPre(json.data); var paramsJson = JSON.stringify(app.docParamRequestList); app.doSaveDocInfo(null, paramsJson, null, false); } else { app.requestResult = json; } }); + }, + processObjectToHtmlPre(data){ + var requestResult = ""; + try { + requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(data), 0, false, false, false, false); + } catch (e) { + try { + requestResult = Formatjson.processObjectToHtmlPre(data, 0, false, false, false, false); + } catch (e) { + requestResult = data; + } + } + return requestResult; } } });