From b45f0c19b231769393f69f9ffa41e82cefe9a9d8 Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 8 May 2015 23:41:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9WeixinServerBootstrap?= =?UTF-8?q?=E7=B1=BB=E9=83=A8=E5=88=86=E6=96=B9=E6=B3=95=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin4j-server/README.md | 6 +- .../dispatcher/WeixinMessageDispatcher.java | 39 ++++++---- .../startup/WeixinServerBootstrap.java | 74 ++++++++++++++----- .../com/foxinmy/weixin4j/util/ClassUtil.java | 16 +--- .../server/test/MessageServerStarup.java | 19 +++-- 5 files changed, 100 insertions(+), 54 deletions(-) diff --git a/weixin4j-server/README.md b/weixin4j-server/README.md index 87db3cca..d67ff45f 100644 --- a/weixin4j-server/README.md +++ b/weixin4j-server/README.md @@ -19,7 +19,7 @@ weixin4j-server public class MessageServerStartup{ public static void main(String[] args) { - new WeixinServerBootstrap("开发者token").pushMessageHandler( + new WeixinServerBootstrap("开发者token").addHandler( DebugMessageHandler.global).startup(); } } @@ -29,7 +29,7 @@ weixin4j-server public class MessageServerStartup{ public static void main(String[] args) { - new WeixinServerBootstrap("appid","开发者token","加密密钥").pushMessageHandler( + new WeixinServerBootstrap("appid","开发者token","加密密钥").addHandler( DebugMessageHandler.global).startup(); } } @@ -53,7 +53,7 @@ weixin4j-server } }; // 当消息类型为文本(text)时回复「HelloWorld」, 否则回复调试消息 - new WeixinServerBootstrap("appid","开发者token","加密密钥").pushMessageHandler(messageHandler, + new WeixinServerBootstrap("appid","开发者token","加密密钥").addHandler(messageHandler, DebugMessageHandler.global).startup(); } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java index a70fd2fd..fcb1a90b 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java @@ -5,6 +5,8 @@ import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; import java.util.LinkedList; import java.util.List; @@ -23,6 +25,7 @@ import com.foxinmy.weixin4j.type.EncryptType; import com.foxinmy.weixin4j.util.ClassUtil; import com.foxinmy.weixin4j.util.Consts; import com.foxinmy.weixin4j.util.HttpUtil; +import com.foxinmy.weixin4j.util.ReflectionUtil; /** * 微信消息分发器 @@ -139,15 +142,19 @@ public class WeixinMessageDispatcher { } } else { for (Class clazz : messageHandlerClass) { + if (clazz.isInterface() + || Modifier.isAbstract(clazz.getModifiers())) { + continue; + } try { - messageHandlerList.add((WeixinMessageHandler) clazz - .newInstance()); - } catch (InstantiationException ex) { + Constructor ctor = clazz + .getDeclaredConstructor(); + ReflectionUtil.makeAccessible(ctor); + messageHandlerList.add((WeixinMessageHandler) ctor + .newInstance((Object[]) null)); + } catch (Exception ex) { throw new WeixinException(clazz.getName() - + " Is it an abstract class?", ex); - } catch (IllegalAccessException ex) { - throw new WeixinException(clazz.getName() - + " Is the constructor accessible?", ex); + + " instantiate fail", ex); } } } @@ -180,16 +187,20 @@ public class WeixinMessageDispatcher { } } else { for (Class clazz : messageInterceptorClass) { + if (clazz.isInterface() + || Modifier.isAbstract(clazz.getModifiers())) { + continue; + } try { + Constructor ctor = clazz + .getDeclaredConstructor(); + ReflectionUtil.makeAccessible(ctor); messageInterceptorList - .add((WeixinMessageInterceptor) clazz - .newInstance()); - } catch (InstantiationException ex) { + .add((WeixinMessageInterceptor) ctor + .newInstance((Object[]) null)); + } catch (Exception ex) { throw new WeixinException(clazz.getName() - + " Is it an abstract class?", ex); - } catch (IllegalAccessException ex) { - throw new WeixinException(clazz.getName() - + " Is the constructor accessible?", ex); + + " instantiate fail", ex); } } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java index 6695b868..459b1ced 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java @@ -142,56 +142,92 @@ public final class WeixinServerBootstrap { } } - public WeixinServerBootstrap pushMessageHandler( + /** + * 添加一个或者多个消息处理器 + * + * @param messageHandler + * 消息处理器 + * @return + */ + public WeixinServerBootstrap addHandler( WeixinMessageHandler... messageHandler) { messageHandlerList.addAll(Arrays.asList(messageHandler)); return this; } - public WeixinServerBootstrap pushFirstMessageHandler( + /** + * 将某个消息处理器插入到头部 + * + * @param messageHandler + * 消息处理器 + * @return + */ + public WeixinServerBootstrap insertFirstHandler( WeixinMessageHandler messageHandler) { messageHandlerList.add(0, messageHandler); return this; } - public WeixinServerBootstrap pushLastMessageHandler( - WeixinMessageHandler messageHandler) { - messageHandlerList.add(messageHandlerList.size(), messageHandler); - return this; - } - - public WeixinServerBootstrap pushMessageInterceptor( + /** + * 插入一个或多个消息拦截器 + * + * @param messageInterceptor + * 消息拦截器 + * @return + */ + public WeixinServerBootstrap addInterceptor( WeixinMessageInterceptor... messageInterceptor) { messageInterceptorList.addAll(Arrays.asList(messageInterceptor)); return this; } - public WeixinServerBootstrap pushFirstMessageInterceptor( + /** + * 将某个消息拦截器插入到头部 + * + * @param messageInterceptor + * 消息拦截器 + * @return + */ + public WeixinServerBootstrap insertFirstInterceptor( WeixinMessageInterceptor messageInterceptor) { messageInterceptorList.add(0, messageInterceptor); return this; } - public WeixinServerBootstrap pushLastMessageInterceptor( - WeixinMessageInterceptor messageInterceptor) { - messageInterceptorList.add(messageInterceptorList.size(), - messageInterceptor); - return this; - } - - public WeixinServerBootstrap messageHandlerPackagesToScan( + /** + * 按照包名去添加消息处理器 + * + * @param messageHandlerPackages + * 消息处理器所在的包名 + * @return + */ + public WeixinServerBootstrap handlerPackagesToScan( String... messageHandlerPackages) { messageDispatcher.setMessageHandlerPackages(messageHandlerPackages); return this; } - public WeixinServerBootstrap messageInterceptorPackagesToScan( + /** + * 按照包名去添加消息拦截器 + * + * @param messageInterceptorPackages + * 消息拦截器所在的包名 + * @return + */ + public WeixinServerBootstrap interceptorPackagesToScan( String... messageInterceptorPackages) { messageDispatcher .setMessageInterceptorPackages(messageInterceptorPackages); return this; } + /** + * 声明处理器跟拦截器类实例化的构造工厂,否则通过Class.newInstance的方式构造 + * + * @param beanFactory + * Bean构造工厂 + * @return + */ public WeixinServerBootstrap resolveBeanFactory(BeanFactory beanFactory) { messageDispatcher.setBeanFactory(beanFactory); return this; diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java index 2fba1be9..29657126 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java @@ -79,12 +79,8 @@ public final class ClassUtil { packageName + "." + file.getName())); } else { try { - Class clazz = Class.forName(packageName + "." - + file.getName().replace(".class", "")); - if (clazz.isInterface()) { - continue; - } - classes.add(clazz); + classes.add(Class.forName(packageName + "." + + file.getName().replace(".class", ""))); } catch (ClassNotFoundException e) { ; } @@ -119,12 +115,8 @@ public final class ClassUtil { continue; } try { - Class clazz = Class.forName(entryName.replaceAll("/", ".") - .replace(".class", "")); - if (clazz.isInterface()) { - continue; - } - classes.add(clazz); + classes.add(Class.forName(entryName.replaceAll("/", ".") + .replace(".class", ""))); } catch (ClassNotFoundException e) { ; } diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java index 28fc0ae5..248120a4 100644 --- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java +++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java @@ -21,7 +21,7 @@ import com.foxinmy.weixin4j.startup.WeixinServerBootstrap; public class MessageServerStarup { final String appid = "appid"; - final String token = "token"; + final String token = "carsonliu13450438112"; final String aesKey = "aeskey"; /** @@ -31,8 +31,8 @@ public class MessageServerStarup { */ public void test1() throws WeixinException { // 所有请求都回复调试的文本消息 - new WeixinServerBootstrap(token).pushMessageHandler( - DebugMessageHandler.global).startup(); + new WeixinServerBootstrap(token).addHandler(DebugMessageHandler.global) + .startup(); } /** @@ -42,7 +42,7 @@ public class MessageServerStarup { */ public void test2() throws WeixinException { // 所有请求都回复调试的文本消息 - new WeixinServerBootstrap(appid, token, aesKey).pushMessageHandler( + new WeixinServerBootstrap(appid, token, aesKey).addHandler( DebugMessageHandler.global).startup(); } @@ -67,11 +67,18 @@ public class MessageServerStarup { } }; // 当消息类型为文本(text)时回复「HelloWorld」, 否则回复调试消息 - new WeixinServerBootstrap(appid, token, aesKey).pushMessageHandler( + new WeixinServerBootstrap(appid, token, aesKey).addHandler( messageHandler, DebugMessageHandler.global).startup(); } + public void test4() throws WeixinException { + // 扫描包加载消息处理器 + String packageToScan = "com.foxinmy.weixin4j.handler"; + new WeixinServerBootstrap(token).handlerPackagesToScan(packageToScan) + .startup(); + } + public static void main(String[] args) throws WeixinException { - + new MessageServerStarup().test4(); } }