This commit is contained in:
Redkale
2016-08-27 14:25:57 +08:00
parent db32656c8a
commit 7e9885de2e
5 changed files with 24 additions and 12 deletions

View File

@@ -133,6 +133,7 @@
<rest base="org.redkale.net.http.DefaultRestServlet" mustsign="false" autoload="true" includes="" excludes=""> <rest base="org.redkale.net.http.DefaultRestServlet" mustsign="false" autoload="true" includes="" excludes="">
<!-- <!--
value: Service类名列出的表示必须被加载的Service对象 且对象的Resource资源名称只能是""。 value: Service类名列出的表示必须被加载的Service对象 且对象的Resource资源名称只能是""。
ignore: 是否忽略设置为true则不会加载该Service对象默认值为false
--> -->
<service value="com.xxx.XXXXService"/> <service value="com.xxx.XXXXService"/>
</rest> </rest>

View File

@@ -29,9 +29,9 @@ import org.redkale.util.*;
@NodeProtocol({"HTTP"}) @NodeProtocol({"HTTP"})
public class NodeHttpServer extends NodeServer { public class NodeHttpServer extends NodeServer {
protected boolean rest; protected final boolean rest;
protected boolean sncp; protected final boolean sncp;
protected final HttpServer httpServer; protected final HttpServer httpServer;
@@ -154,7 +154,7 @@ public class NodeHttpServer extends NodeServer {
final String threadName = "[" + Thread.currentThread().getName() + "] "; final String threadName = "[" + Thread.currentThread().getName() + "] ";
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>(); final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
final Class<? extends RestHttpServlet> baseServletClass = (Class<? extends RestHttpServlet>) Class.forName(restConf.getValue("servlet", DefaultRestServlet.class.getName())); final Class baseServletClass = Class.forName(restConf.getValue("servlet", DefaultRestServlet.class.getName()));
final boolean autoload = restConf.getBoolValue("autoload", true); final boolean autoload = restConf.getBoolValue("autoload", true);
final boolean mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类 final boolean mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类
@@ -183,7 +183,7 @@ public class NodeHttpServer extends NodeServer {
if (!autoload && !includeValues.contains(stypename)) return; if (!autoload && !includeValues.contains(stypename)) return;
if (!restFilter.accept(stypename)) return; if (!restFilter.accept(stypename)) return;
RestHttpServlet servlet = RestServletBuilder.createRestServlet(baseServletClass, wrapper.getName(), stype, sncp); RestHttpServlet servlet = Rest.createRestServlet(baseServletClass, wrapper.getName(), stype);
if (servlet == null) return; if (servlet == null) return;
if (finest) logger.finest("Create RestServlet = " + servlet); if (finest) logger.finest("Create RestServlet = " + servlet);
try { try {

View File

@@ -25,7 +25,7 @@ import org.redkale.source.Flipper;
* *
* @author zhangjx * @author zhangjx
*/ */
public final class RestServletBuilder { public final class Rest {
private static final Set<String> EXCLUDERMETHODS = new HashSet<>(); private static final Set<String> EXCLUDERMETHODS = new HashSet<>();
@@ -35,7 +35,7 @@ public final class RestServletBuilder {
} }
} }
private RestServletBuilder() { private Rest() {
} }
public static String getWebModuleName(Class<? extends Service> serviceType) { public static String getWebModuleName(Class<? extends Service> serviceType) {
@@ -45,8 +45,7 @@ public final class RestServletBuilder {
return (!controller.value().isEmpty()) ? controller.value() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase(); return (!controller.value().isEmpty()) ? controller.value() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
} }
//待实现 public static <T extends RestHttpServlet> T createRestServlet(final Class<T> baseServletClass, final String serviceName, final Class<? extends Service> serviceType) {
public static <T extends RestHttpServlet> T createRestServlet(final Class<T> baseServletClass, final String serviceName, final Class<? extends Service> serviceType, final boolean sncp) {
if (baseServletClass == null || serviceType == null) return null; if (baseServletClass == null || serviceType == null) return null;
if (!RestHttpServlet.class.isAssignableFrom(baseServletClass)) return null; if (!RestHttpServlet.class.isAssignableFrom(baseServletClass)) return null;
int mod = baseServletClass.getModifiers(); int mod = baseServletClass.getModifiers();

View File

@@ -6,6 +6,7 @@
package org.redkale.net.http; package org.redkale.net.http;
import java.io.IOException; import java.io.IOException;
import org.redkale.util.Attribute;
/** /**
* *
@@ -16,6 +17,17 @@ import java.io.IOException;
*/ */
public abstract class RestHttpServlet<T> extends HttpBaseServlet { public abstract class RestHttpServlet<T> extends HttpBaseServlet {
Attribute[] _paramAttrs; // 为null表示无DynCall处理index=0固定为null, 其他为参数标记的DynCall回调方法
protected abstract T currentUser(HttpRequest req) throws IOException; protected abstract T currentUser(HttpRequest req) throws IOException;
protected void _callParameter(final HttpResponse response, final Object... params) {
if (_paramAttrs == null) return;
for (int i = 1; i < _paramAttrs.length; i++) {
org.redkale.util.Attribute attr = _paramAttrs[i];
if (attr == null) continue;
//convert.convertTo(out, attr.type(), attr.get(params[i - 1]));
}
}
} }

View File

@@ -146,7 +146,7 @@ public final class SncpDynServlet extends SncpServlet {
public abstract void action(final BsonReader in, final BsonWriter out) throws Throwable; public abstract void action(final BsonReader in, final BsonWriter out) throws Throwable;
public final void callParameter(final BsonWriter out, final Object... params) { public final void _callParameter(final BsonWriter out, final Object... params) {
if (paramAttrs != null) { if (paramAttrs != null) {
for (int i = 1; i < paramAttrs.length; i++) { for (int i = 1; i < paramAttrs.length; i++) {
org.redkale.util.Attribute attr = paramAttrs[i]; org.redkale.util.Attribute attr = paramAttrs[i];
@@ -176,7 +176,7 @@ public final class SncpDynServlet extends SncpServlet {
* String arg2 = convert.convertFrom(paramTypes[2], in); * String arg2 = convert.convertFrom(paramTypes[2], in);
* int arg3 = convert.convertFrom(paramTypes[3], in); * int arg3 = convert.convertFrom(paramTypes[3], in);
* Object rs = service.change(arg1, arg2, arg3); * Object rs = service.change(arg1, arg2, arg3);
* callParameter(out, arg1, arg2, arg3); * _callParameter(out, arg1, arg2, arg3);
* convert.convertTo(out, paramTypes[0], rs); * convert.convertTo(out, paramTypes[0], rs);
* } * }
* } * }
@@ -317,7 +317,7 @@ public final class SncpDynServlet extends SncpServlet {
} }
mv.visitVarInsn(ASTORE, store); //11 mv.visitVarInsn(ASTORE, store); //11
} }
//------------------------- callParameter 方法 -------------------------------- //------------------------- _callParameter 方法 --------------------------------
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 2);
if (paramClasses.length <= 5) { //参数总数量 if (paramClasses.length <= 5) { //参数总数量
@@ -353,7 +353,7 @@ public final class SncpDynServlet extends SncpServlet {
} }
mv.visitInsn(AASTORE); mv.visitInsn(AASTORE);
} }
mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "callParameter", "(" + convertWriterDesc + "[Ljava/lang/Object;)V", false); mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "_callParameter", "(" + convertWriterDesc + "[Ljava/lang/Object;)V", false);
//-------------------------直接返回 或者 调用convertTo方法 -------------------------------- //-------------------------直接返回 或者 调用convertTo方法 --------------------------------
int maxStack = codes.length > 0 ? codes[codes.length - 1][1] : 1; int maxStack = codes.length > 0 ? codes[codes.length - 1][1] : 1;