This commit is contained in:
Redkale
2016-09-26 13:19:09 +08:00
parent 1da2e95f46
commit 1720470424
4 changed files with 43 additions and 26 deletions

View File

@@ -70,7 +70,7 @@ public class ApiDocs extends HttpBaseServlet {
actionmap.put("comment", action.comment());
List<Map> paramsList = new ArrayList<>();
actionmap.put("params", paramsList);
for (WebParam param : action.params()) {
for (WebParam param : method.getAnnotationsByType(WebParam.class)) {
final Map<String, Object> parammap = new LinkedHashMap<>();
final boolean isarray = param.type().isArray();
final Class ptype = isarray ? param.type().getComponentType() : param.type();

View File

@@ -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 使用。
* 用于对&#64;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 {
/**

View File

@@ -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<Map<String, Object>> paramMaps = new ArrayList<>();
for (Object[] ps : paramlist) {
Map<String, Object> paramMap = new LinkedHashMap<>();

View File

@@ -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 + ");");