diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index 14e9efb9e..00a875d7e 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -116,7 +116,7 @@ diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index 75596c032..da7ff2458 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -27,7 +27,7 @@ import org.redkale.convert.bson.BsonFactory; import org.redkale.convert.json.*; import org.redkale.mq.*; import org.redkale.net.*; -import org.redkale.net.http.MimeType; +import org.redkale.net.http.*; import org.redkale.net.sncp.*; import org.redkale.service.Service; import org.redkale.source.*; @@ -175,6 +175,8 @@ public final class Application { //监听事件 private final List listeners = new CopyOnWriteArrayList<>(); + final List restListeners = new CopyOnWriteArrayList<>(); + //服务启动时间 private final long startTime = System.currentTimeMillis(); @@ -733,6 +735,11 @@ public final class Application { final String listenClass = conf.getValue("value", ""); if (listenClass.isEmpty()) continue; Class clazz = classLoader.loadClass(listenClass); + if (RestDyncListener.class.isAssignableFrom(clazz)) { + RestDyncListener listener = (RestDyncListener) clazz.getDeclaredConstructor().newInstance(); + this.restListeners.add(listener); + continue; + } if (!ApplicationListener.class.isAssignableFrom(clazz)) continue; @SuppressWarnings("unchecked") ApplicationListener listener = (ApplicationListener) clazz.getDeclaredConstructor().newInstance(); diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 39159545b..b14e89cee 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -284,7 +284,7 @@ public class NodeHttpServer extends NodeServer { } restedObjects.add(service); //避免重复创建Rest对象 } - HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix); + HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix, application.restListeners); if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null String prefix2 = prefix; WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class); diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index 043a64998..36451707c 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -238,11 +238,12 @@ public class HttpServer extends Server T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class baseServletType, final String prefix) { - return addRestServlet(classLoader, null, service, userType, baseServletType, prefix); + public T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class baseServletType, final String prefix, final List listeners) { + return addRestServlet(classLoader, null, service, userType, baseServletType, prefix, listeners); } /** @@ -256,11 +257,13 @@ public class HttpServer extends Server T addRestServlet(final ClassLoader classLoader, final String name, final S service, final Class userType, final Class baseServletType, final String prefix) { + public T addRestServlet(final ClassLoader classLoader, final String name, final S service, + final Class userType, final Class baseServletType, final String prefix, final List listeners) { T servlet = null; final boolean sncp = Sncp.isSncpDyn(service); final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name; @@ -281,7 +284,7 @@ public class HttpServer extends Server T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class baseServletType, final Class serviceType) { + public static T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class baseServletType, + final Class serviceType, final List listeners) { if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet"); if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet"); int mod = baseServletType.getModifiers(); @@ -1158,7 +1159,7 @@ public final class Rest { } } while ((loop = loop.getSuperclass()) != Object.class); } - java.lang.reflect.Type paramtype = TypeToken.getGenericType( param.getParameterizedType(),serviceType); + java.lang.reflect.Type paramtype = TypeToken.getGenericType(param.getParameterizedType(), serviceType); paramlist.add(new Object[]{param, n, ptype, radix, comment, required, annpara, annsid, annaddr, annhead, anncookie, annbody, annfile, annuri, userid, annheaders, paramtype}); } @@ -1949,6 +1950,11 @@ public final class Rest { cw2.visitEnd(); newLoader.addClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), cw2.toByteArray()); } + if (listeners != null && !listeners.isEmpty()) { + for (RestDyncListener listener : listeners) { + listener.invoke(classLoader, userType, serviceType, method); + } + } } // end for each // HashMap _createRestInnerActionEntry() { diff --git a/src/org/redkale/net/http/RestDyncListener.java b/src/org/redkale/net/http/RestDyncListener.java new file mode 100644 index 000000000..5414d82a2 --- /dev/null +++ b/src/org/redkale/net/http/RestDyncListener.java @@ -0,0 +1,25 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net.http; + +import java.lang.reflect.Method; +import org.redkale.service.Service; + +/** + * Application进程启动后动态创建RestServlet时调用
+ * 只能通过application.xml配置 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.2.0 + */ +public interface RestDyncListener { + + public void invoke(final ClassLoader classLoader, final Class baseServletType, + final Class serviceType, final Method method); +} diff --git a/test/org/redkale/test/rest/_DynHelloRestServlet1.java b/test/org/redkale/test/rest/_DynHelloRestServlet1.java index cac559e70..8cef2f985 100644 --- a/test/org/redkale/test/rest/_DynHelloRestServlet1.java +++ b/test/org/redkale/test/rest/_DynHelloRestServlet1.java @@ -23,8 +23,8 @@ public class _DynHelloRestServlet1 extends SimpleRestServlet { HelloService service = new HelloService(); HttpServer server = new HttpServer(); - System.out.println(server.addRestServlet(null, service, null, SimpleRestServlet.class, "/pipes")); - System.out.println(server.addRestServlet(null, new HelloService(3), null, SimpleRestServlet.class, "/pipes")); + System.out.println(server.addRestServlet(null, service, null, SimpleRestServlet.class, "/pipes", null)); + System.out.println(server.addRestServlet(null, new HelloService(3), null, SimpleRestServlet.class, "/pipes", null)); DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port); server.init(conf); diff --git a/test/org/redkale/test/service/ABMainService.java b/test/org/redkale/test/service/ABMainService.java index b50ce40d1..ad4ff7606 100644 --- a/test/org/redkale/test/service/ABMainService.java +++ b/test/org/redkale/test/service/ABMainService.java @@ -73,7 +73,7 @@ public class ABMainService implements Service { HttpServer server = new HttpServer(); server.getLogger().setLevel(Level.WARNING); - server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); + server.addRestServlet(null, service, null, HttpServlet.class, "/pipes", null); resFactory.inject(cservice); resFactory.inject(bcservice); @@ -114,7 +114,7 @@ public class ABMainService implements Service { HttpServer server = new HttpServer(); server.getLogger().setLevel(Level.WARNING); - server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); + server.addRestServlet(null, service, null, HttpServlet.class, "/pipes", null); server.init(DefaultAnyValue.create("port", "" + abport)); server.start();