diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index ad8de5c32..9be91d216 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -164,7 +164,7 @@ public final class ClassFilter { } catch (Throwable cfe) { if (finer && !clazzname.startsWith("sun.") && !clazzname.startsWith("javax.") && !clazzname.startsWith("com.sun.") && !clazzname.startsWith("jdk.")) { - logger.log(Level.FINER, ClassFilter.class.getSimpleName() + " filter error", cfe); + //logger.log(Level.FINEST, ClassFilter.class.getSimpleName() + " filter error", cfe); } } } diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 5bc8ee77c..8ebfe99b9 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -187,6 +187,7 @@ public final class NodeHttpServer extends NodeServer { RestHttpServlet servlet = RestServletBuilder.createRestServlet(superClass, wrapper.getName(), stype); if (servlet == null) return; + if(finest) logger.finest("Create RestServlet = "+servlet); try { Field serviceField = servlet.getClass().getDeclaredField("_service"); serviceField.setAccessible(true); diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 05384c36f..d71723daa 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -48,9 +48,12 @@ public abstract class NodeServer { //日志是否为FINE级别 protected final boolean fine; - //日志是否为FINE级别 + //日志是否为FINER级别 protected final boolean finer; + //日志是否为FINEST级别 + protected final boolean finest; + //进程主类 protected final Application application; @@ -91,6 +94,7 @@ public abstract class NodeServer { this.logger = Logger.getLogger(this.getClass().getSimpleName()); this.fine = logger.isLoggable(Level.FINE); this.finer = logger.isLoggable(Level.FINER); + this.finest = logger.isLoggable(Level.FINEST); } protected Consumer getExecutor() throws Exception { diff --git a/src/org/redkale/net/http/RestServletBuilder.java b/src/org/redkale/net/http/RestServletBuilder.java index 19c52faec..ef0a21639 100644 --- a/src/org/redkale/net/http/RestServletBuilder.java +++ b/src/org/redkale/net/http/RestServletBuilder.java @@ -12,6 +12,7 @@ import jdk.internal.org.objectweb.asm.*; import static jdk.internal.org.objectweb.asm.ClassWriter.COMPUTE_FRAMES; import static jdk.internal.org.objectweb.asm.Opcodes.*; import jdk.internal.org.objectweb.asm.Type; +import org.redkale.convert.json.JsonConvert; import org.redkale.net.sncp.*; import org.redkale.service.*; import org.redkale.util.*; @@ -87,18 +88,26 @@ public final class RestServletBuilder { FieldVisitor fv; AsmMethodVisitor mv; AnnotationVisitor av0; - + Map classMap = new LinkedHashMap<>(); + List> actionMaps = new ArrayList<>(); cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null); { //注入 @WebServlet 注解 + String urlpath = "/" + defmodulename + "/*"; + int moduleid = controller == null ? 0 : controller.module(); + boolean repair = controller == null ? true : controller.repair(); av0 = cw.visitAnnotation(webServletDesc, true); { AnnotationVisitor av1 = av0.visitArray("value"); - av1.visit(null, "/" + defmodulename + "/*"); + av1.visit(null, urlpath); av1.visitEnd(); } - av0.visit("moduleid", controller == null ? 0 : controller.module()); - av0.visit("repair", controller == null ? true : controller.repair()); + av0.visit("moduleid", moduleid); + av0.visit("repair", repair); av0.visitEnd(); + classMap.put("type", serviceType.getName()); + classMap.put("url", urlpath); + classMap.put("moduleid", moduleid); + classMap.put("repair", repair); } { //注入 @Resource private XXXService _service; @@ -118,6 +127,7 @@ public final class RestServletBuilder { } final List entrys = new ArrayList<>(); + for (final Method method : serviceType.getMethods()) { Class[] extypes = method.getExceptionTypes(); if (extypes.length > 1) continue; @@ -148,7 +158,7 @@ public final class RestServletBuilder { } } if (entrys.isEmpty()) return null; //没有可WebAction的方法 - + Map actionMap = new LinkedHashMap<>(); for (final MappingEntry entry : entrys) { final Method method = entry.mappingMethod; final Class returnType = method.getReturnType(); @@ -168,7 +178,9 @@ public final class RestServletBuilder { boolean hasVisitWebAction = false; final String jsvar = entry.jsvar.isEmpty() ? null : entry.jsvar; int argIndex = 0; + List> paramMaps = new ArrayList<>(); for (final Parameter param : params) { + Map paramMap = new LinkedHashMap<>(); final Class ptype = param.getType(); RestParam annpara = param.getAnnotation(RestParam.class); String n = annpara == null || annpara.value().isEmpty() ? null : annpara.value(); @@ -186,7 +198,8 @@ public final class RestServletBuilder { hasVisitWebAction = true; //设置 WebAction av0 = mv.visitAnnotation(actionDesc, true); - av0.visit("url", "/" + defmodulename.toLowerCase() + "/" + entry.name + ("#".equals(n) ? "/" : "")); + String url = "/" + defmodulename.toLowerCase() + "/" + entry.name + ("#".equals(n) ? "/" : ""); + av0.visit("url", url); av0.visit("actionid", entry.actionid); AnnotationVisitor av1 = av0.visitArray("methods"); @@ -196,10 +209,15 @@ public final class RestServletBuilder { av1.visitEnd(); av0.visitEnd(); + actionMap.put("url", url); + actionMap.put("actionid", entry.actionid); + actionMap.put("methods", entry.methods); } final String pname = n; //参数名 final boolean hd = annpara == null ? false : annpara.header(); //是否取getHeader 而不是 getParameter + paramMap.put("name", pname); + paramMap.put("type", ptype.getName()); if ("#".equals(pname)) { //从request.getRequstURI 中去参数 if (ptype == boolean.class) { mv.visitVarInsn(ALOAD, 1); @@ -351,22 +369,26 @@ public final class RestServletBuilder { varInsns.add(new int[]{ALOAD, maxLocals}); } maxLocals++; + paramMaps.add(paramMap); } // end params for each if (!hasVisitWebAction) { //当无参数时则没有设置过 WebAction hasVisitWebAction = true; //设置 WebAction av0 = mv.visitAnnotation(actionDesc, true); - av0.visit("url", "/" + defmodulename.toLowerCase() + "/" + entry.name); + String url = "/" + defmodulename.toLowerCase() + "/" + entry.name; + av0.visit("url", url); av0.visit("actionid", entry.actionid); - - AnnotationVisitor av1 = av0.visitArray("methods"); - for (String m : entry.methods) { - av1.visit(null, m); - } - av1.visitEnd(); - + AnnotationVisitor av1 = av0.visitArray("methods"); + for (String m : entry.methods) { + av1.visit(null, m); + } + av1.visitEnd(); av0.visitEnd(); + + actionMap.put("url", url); + actionMap.put("actionid", entry.actionid); + actionMap.put("methods", entry.methods); } mv.visitVarInsn(ALOAD, 0); //调用this @@ -607,8 +629,20 @@ public final class RestServletBuilder { maxLocals++; } mv.visitMaxs(maxStack, maxLocals); + actionMap.put("params", paramMaps); + actionMaps.add(actionMap); + } // end for each + classMap.put("actions", actionMaps); + + { //toString函数 + mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null)); + //mv.setDebug(true); + mv.visitLdcInsn(JsonConvert.root().convertTo(classMap)); + mv.visitInsn(ARETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } - } // end for each cw.visitEnd(); byte[] bytes = cw.toByteArray(); Class newClazz = new ClassLoader(loader) { diff --git a/src/org/redkale/util/AnyValue.java b/src/org/redkale/util/AnyValue.java index 77086c64d..aea57da47 100644 --- a/src/org/redkale/util/AnyValue.java +++ b/src/org/redkale/util/AnyValue.java @@ -211,6 +211,14 @@ public abstract class AnyValue { return this; } + public DefaultAnyValue addValue(String name, boolean value) { + return addValue(name, String.valueOf(value)); + } + + public DefaultAnyValue addValue(String name, Number value) { + return addValue(name, String.valueOf(value)); + } + public DefaultAnyValue addValue(String name, String value) { if (name == null) return this; int len = this.stringValues.length;