diff --git a/src/org/redkale/boot/ApiDocs.java b/src/org/redkale/boot/ApiDocs.java index 12fa70e06..527fe5625 100644 --- a/src/org/redkale/boot/ApiDocs.java +++ b/src/org/redkale/boot/ApiDocs.java @@ -70,7 +70,7 @@ public class ApiDocs extends HttpBaseServlet { actionmap.put("comment", action.comment()); List paramsList = new ArrayList<>(); actionmap.put("params", paramsList); - for (WebParam param : action.params()) { + for (WebParam param : method.getAnnotationsByType(WebParam.class)) { final Map parammap = new LinkedHashMap<>(); final boolean isarray = param.type().isArray(); final Class ptype = isarray ? param.type().getComponentType() : param.type(); diff --git a/src/org/redkale/net/http/HttpBaseServlet.java b/src/org/redkale/net/http/HttpBaseServlet.java index 98f76f01e..61128a607 100644 --- a/src/org/redkale/net/http/HttpBaseServlet.java +++ b/src/org/redkale/net/http/HttpBaseServlet.java @@ -74,9 +74,10 @@ public abstract class HttpBaseServlet extends HttpServlet { * * @author zhangjx */ - @Target({ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) - @Retention(RetentionPolicy.RUNTIME) @Documented + @Target({METHOD}) + @Retention(RUNTIME) + @Repeatable(WebParams.class) protected @interface WebParam { String name(); //参数名 @@ -90,6 +91,14 @@ public abstract class HttpBaseServlet extends HttpServlet { int radix() default 10; //转换数字byte/short/int/long时所用的进制数, 默认10进制 } + @Documented + @Target({METHOD}) + @Retention(RUNTIME) + protected @interface WebParams { + + WebParam[] value(); + } + /** * 配合 HttpBaseServlet 使用。 * 用于对@WebServlet对应的url进行细分。 其url必须是包含WebServlet中定义的前缀, 且不能是正则表达式 @@ -99,9 +108,9 @@ public abstract class HttpBaseServlet extends HttpServlet { * * @author zhangjx */ - @Target({ElementType.METHOD}) - @Retention(RetentionPolicy.RUNTIME) @Documented + @Target({METHOD}) + @Retention(RUNTIME) protected @interface WebAction { int actionid() default 0; @@ -112,8 +121,6 @@ public abstract class HttpBaseServlet extends HttpServlet { String comment() default ""; //备注描述 - WebParam[] params() default {}; - String result() default "Object"; //输出结果的数据类型 } @@ -128,9 +135,9 @@ public abstract class HttpBaseServlet extends HttpServlet { * * @author zhangjx */ - @Target({ElementType.METHOD}) - @Retention(RetentionPolicy.RUNTIME) @Documented + @Target({METHOD}) + @Retention(RUNTIME) protected @interface HttpCacheable { /** diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index ac4ed1159..469952c7b 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -81,6 +81,7 @@ public final class Rest { final String cacheDesc = Type.getDescriptor(HttpBaseServlet.HttpCacheable.class); final String actionDesc = Type.getDescriptor(HttpBaseServlet.WebAction.class); final String webparamDesc = Type.getDescriptor(HttpBaseServlet.WebParam.class); + final String webparamsDesc = Type.getDescriptor(HttpBaseServlet.WebParams.class); final String sourcetypeDesc = Type.getDescriptor(HttpBaseServlet.ParamSourceType.class); final String reqInternalName = Type.getInternalName(HttpRequest.class); @@ -333,23 +334,6 @@ public final class Rest { } av1.visitEnd(); - { - AnnotationVisitor av3 = av0.visitArray("params"); - for (Object[] ps : paramlist) { //{param, n, ptype, radix, comment, annpara, annsid, annaddr, annhead, anncookie} - final boolean ishead = ((RestHeader) ps[8]) != null; //是否取getHeader 而不是 getParameter - final boolean iscookie = ((RestCookie) ps[9]) != null; //是否取getCookie - - AnnotationVisitor av2 = av3.visitAnnotation(null, webparamDesc); - av2.visit("name", (String) ps[1]); - av2.visit("type", Type.getType(Type.getDescriptor((Class) ps[2]))); - av2.visit("radix", (Integer) ps[3]); - av2.visitEnum("src", sourcetypeDesc, ishead ? HttpBaseServlet.ParamSourceType.HEADER.name() - : (iscookie ? HttpBaseServlet.ParamSourceType.COOKIE.name() : HttpBaseServlet.ParamSourceType.PARAMETER.name())); - av2.visit("comment", (String) ps[4]); - av2.visitEnd(); - } - av3.visitEnd(); - } java.lang.reflect.Type grt = method.getGenericReturnType(); av0.visit("result", grt == returnType ? returnType.getName() : String.valueOf(grt)); @@ -363,6 +347,26 @@ public final class Rest { actionMap.put("result", grt == returnType ? returnType.getName() : String.valueOf(grt)); } + { + av0 = mv.visitAnnotation(webparamsDesc, true); + AnnotationVisitor av1 = av0.visitArray("value"); + //设置 WebParam + for (Object[] ps : paramlist) { //{param, n, ptype, radix, comment, annpara, annsid, annaddr, annhead, anncookie} + final boolean ishead = ((RestHeader) ps[8]) != null; //是否取getHeader 而不是 getParameter + final boolean iscookie = ((RestCookie) ps[9]) != null; //是否取getCookie + + AnnotationVisitor av2 = av1.visitAnnotation(null, webparamDesc); + av2.visit("name", (String) ps[1]); + av2.visit("type", Type.getType(Type.getDescriptor((Class) ps[2]))); + av2.visit("radix", (Integer) ps[3]); + av2.visitEnum("src", sourcetypeDesc, ishead ? HttpBaseServlet.ParamSourceType.HEADER.name() + : (iscookie ? HttpBaseServlet.ParamSourceType.COOKIE.name() : HttpBaseServlet.ParamSourceType.PARAMETER.name())); + av2.visit("comment", (String) ps[4]); + av2.visitEnd(); + } + av1.visitEnd(); + av0.visitEnd(); + } List> paramMaps = new ArrayList<>(); for (Object[] ps : paramlist) { Map paramMap = new LinkedHashMap<>(); diff --git a/src/org/redkale/util/AsmMethodVisitor.java b/src/org/redkale/util/AsmMethodVisitor.java index 577112237..00550bb61 100644 --- a/src/org/redkale/util/AsmMethodVisitor.java +++ b/src/org/redkale/util/AsmMethodVisitor.java @@ -72,6 +72,12 @@ public class AsmMethodVisitor { return av; } + public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { + AnnotationVisitor av = visitor.visitTypeAnnotation(typeRef, typePath, desc, visible); + if (debug) System.out.println("mv.visitTypeAnnotation(" + typeRef + ", " + typePath + ", \"" + desc + "\", " + visible + ");"); + return av; + } + public void visitParameter(String name, int access) { visitor.visitParameter(name, access); if (debug) System.out.println("mv.visitParameter(" + name + ", " + access + ");");