diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index a05503ea7..ff13d33d0 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -256,17 +256,19 @@ public class HttpServer extends Server serviceType = Sncp.getServiceType(service); - for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) { - if (!(item instanceof HttpServlet)) continue; - if (item.getClass().getAnnotation(Rest.RestDyn.class) == null) continue; - try { - Field field = item.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME); - if (serviceType.equals(field.getType())) { - servlet = (T) item; - break; + if (name != null) { + for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) { + if (!(item instanceof HttpServlet)) continue; + if (item.getClass().getAnnotation(Rest.RestDyn.class) == null) continue; + try { + Field field = item.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME); + if (serviceType.equals(field.getType())) { + servlet = (T) item; + break; + } + } catch (NoSuchFieldException | SecurityException e) { + logger.log(Level.SEVERE, "serviceType = " + serviceType + ", servletClass = " + item.getClass(), e); } - } catch (NoSuchFieldException | SecurityException e) { - logger.log(Level.SEVERE, "serviceType = " + serviceType + ", servletClass = " + item.getClass(), e); } } final boolean first = servlet == null; diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index a420d1078..49f61108d 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -39,6 +39,8 @@ public final class Rest { static final String REST_SERVICE_FIELD_NAME = "_redkale_service"; + static final String REST_TOSTRINGOBJ_FIELD_NAME = "_redkale_tostringsupplier"; + static final String REST_JSONCONVERT_FIELD_PREFIX = "_redkale_jsonconvert_"; static final String REST_SERVICEMAP_FIELD_NAME = "_redkale_servicemap"; //如果只有name=""的Service资源,则实例中_servicemap必须为null @@ -251,7 +253,19 @@ public final class Rest { final String resourceGenericDescriptor = sb1.length() == sb2.length() ? null : sb2.toString(); //---------------------------------------------------------------------------------------- - final Map> asmParamMap = MethodParamClassVisitor.getMethodParamNames(new HashMap<>(), webSocketType); + boolean namePresent = false; + try { + Method m0 = null; + for (Method method : webSocketType.getMethods()) { + if (method.getParameterCount() > 0) { + m0 = method; + break; + } + } + namePresent = m0 == null ? true : m0.getParameters()[0].isNamePresent(); + } catch (Exception e) { + } + final Map> asmParamMap = namePresent ? null : MethodParamClassVisitor.getMethodParamNames(new HashMap<>(), webSocketType); final Set messageNames = new HashSet<>(); final List messageMethods = new ArrayList<>(); for (Method method : webSocketType.getMethods()) { @@ -849,6 +863,10 @@ public final class Rest { fv = cw.visitField(ACC_PRIVATE, REST_PARAMTYPES_FIELD_NAME, "[[Ljava/lang/reflect/Type;", null, null); fv.visitEnd(); } + { //_redkale_tostringsupplier字段 Supplier + fv = cw.visitField(ACC_PRIVATE, REST_TOSTRINGOBJ_FIELD_NAME, "Ljava/util/function/Supplier;", "Ljava/util/function/Supplier;", null); + fv.visitEnd(); + } { //构造函数 mv = new MethodDebugVisitor(cw.visitMethod(ACC_PUBLIC, "", "()V", null, null)); //mv.setDebug(true); @@ -860,7 +878,19 @@ public final class Rest { } //将每个Service可转换的方法生成HttpServlet对应的HttpMapping方法 - final Map> asmParamMap = MethodParamClassVisitor.getMethodParamNames(new HashMap<>(), serviceType); + boolean namePresent = false; + try { + Method m0 = null; + for (final MappingEntry entry : entrys) { + if (entry.mappingMethod.getParameterCount() > 0) { + m0 = entry.mappingMethod; + break; + } + } + namePresent = m0 == null ? true : m0.getParameters()[0].isNamePresent(); + } catch (Exception e) { + } + final Map> asmParamMap = namePresent ? null : MethodParamClassVisitor.getMethodParamNames(new HashMap<>(), serviceType); final Map bodyTypes = new HashMap<>(); final List restConverts = new ArrayList<>(); @@ -1729,11 +1759,14 @@ public final class Rest { fv.visitEnd(); } - //classMap.put("mappings", mappingMaps); //不显示太多信息 - { //toString函数 + //classMap.put("mappings", mappingMaps); //不显示太多信息 + { //toString函数 mv = new MethodDebugVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null)); //mv.setDebug(true); - mv.visitLdcInsn(JsonConvert.root().convertTo(classMap)); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, newDynName, REST_TOSTRINGOBJ_FIELD_NAME, "Ljava/util/function/Supplier;"); + mv.visitMethodInsn(INVOKEINTERFACE, "java/util/function/Supplier", "get", "()Ljava/lang/Object;", true); + mv.visitTypeInsn(CHECKCAST, "java/lang/String"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); @@ -1767,6 +1800,11 @@ public final class Rest { paramtypeArray = paramtypes.toArray(paramtypeArray); typesfield.set(obj, paramtypeArray); + Field tostringfield = newClazz.getDeclaredField(REST_TOSTRINGOBJ_FIELD_NAME); + tostringfield.setAccessible(true); + java.util.function.Supplier sSupplier = () -> JsonConvert.root().convertTo(classMap); + tostringfield.set(obj, sSupplier); + return obj; } catch (Exception e) { throw new RuntimeException(e);