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="">
<!--
value: Service类名列出的表示必须被加载的Service对象 且对象的Resource资源名称只能是""。
ignore: 是否忽略设置为true则不会加载该Service对象默认值为false
-->
<service value="com.xxx.XXXXService"/>
</rest>

View File

@@ -29,9 +29,9 @@ import org.redkale.util.*;
@NodeProtocol({"HTTP"})
public class NodeHttpServer extends NodeServer {
protected boolean rest;
protected final boolean rest;
protected boolean sncp;
protected final boolean sncp;
protected final HttpServer httpServer;
@@ -154,7 +154,7 @@ public class NodeHttpServer extends NodeServer {
final String threadName = "[" + Thread.currentThread().getName() + "] ";
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 mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类
@@ -183,7 +183,7 @@ public class NodeHttpServer extends NodeServer {
if (!autoload && !includeValues.contains(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 (finest) logger.finest("Create RestServlet = " + servlet);
try {

View File

@@ -25,7 +25,7 @@ import org.redkale.source.Flipper;
*
* @author zhangjx
*/
public final class RestServletBuilder {
public final class Rest {
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) {
@@ -45,8 +45,7 @@ public final class RestServletBuilder {
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, final boolean sncp) {
public static <T extends RestHttpServlet> T createRestServlet(final Class<T> baseServletClass, final String serviceName, final Class<? extends Service> serviceType) {
if (baseServletClass == null || serviceType == null) return null;
if (!RestHttpServlet.class.isAssignableFrom(baseServletClass)) return null;
int mod = baseServletClass.getModifiers();

View File

@@ -6,6 +6,7 @@
package org.redkale.net.http;
import java.io.IOException;
import org.redkale.util.Attribute;
/**
*
@@ -16,6 +17,17 @@ import java.io.IOException;
*/
public abstract class RestHttpServlet<T> extends HttpBaseServlet {
Attribute[] _paramAttrs; // 为null表示无DynCall处理index=0固定为null, 其他为参数标记的DynCall回调方法
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 final void callParameter(final BsonWriter out, final Object... params) {
public final void _callParameter(final BsonWriter out, final Object... params) {
if (paramAttrs != null) {
for (int i = 1; i < paramAttrs.length; 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);
* int arg3 = convert.convertFrom(paramTypes[3], in);
* Object rs = service.change(arg1, arg2, arg3);
* callParameter(out, arg1, arg2, arg3);
* _callParameter(out, arg1, arg2, arg3);
* convert.convertTo(out, paramTypes[0], rs);
* }
* }
@@ -317,7 +317,7 @@ public final class SncpDynServlet extends SncpServlet {
}
mv.visitVarInsn(ASTORE, store); //11
}
//------------------------- callParameter 方法 --------------------------------
//------------------------- _callParameter 方法 --------------------------------
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 2);
if (paramClasses.length <= 5) { //参数总数量
@@ -353,7 +353,7 @@ public final class SncpDynServlet extends SncpServlet {
}
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方法 --------------------------------
int maxStack = codes.length > 0 ? codes[codes.length - 1][1] : 1;