diff --git a/weixin4j-server/CHANGE.md b/weixin4j-server/CHANGE.md index 0b709379..e6841d60 100644 --- a/weixin4j-server/CHANGE.md +++ b/weixin4j-server/CHANGE.md @@ -134,4 +134,11 @@ * 2015-02-04 - + version upgrade to 1.1.6 \ No newline at end of file + + version upgrade to 1.1.6 + + +* 2015-03-12 + + + 修改ClassUtil获取class不到的bug + + + 新增MultipleMessageHandlerAdapter多个消息适配类 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/BeanFactory.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/BeanFactory.java index 633f3724..56e08b35 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/BeanFactory.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/BeanFactory.java @@ -1,5 +1,7 @@ package com.foxinmy.weixin4j.dispatcher; +import java.util.Map; + import com.foxinmy.weixin4j.exception.WeixinException; /** @@ -17,4 +19,6 @@ public interface BeanFactory { T getBean(Class clazz) throws WeixinException; T getBean(String name, Class clazz) throws WeixinException; + + Map getBeans(Class clazz) throws WeixinException; } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/MessageHandlerExecutor.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/MessageHandlerExecutor.java index d00030eb..da801d97 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/MessageHandlerExecutor.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/MessageHandlerExecutor.java @@ -7,6 +7,7 @@ import io.netty.util.internal.logging.InternalLoggerFactory; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -62,7 +63,7 @@ public class MessageHandlerExecutor { * @return true则继续执行往下执行 * @throws WeixinException */ - public boolean applyPreHandle(WeixinRequest request, Object message) + public boolean applyPreHandle(WeixinRequest request, WeixinMessage message) throws WeixinException { if (messageInterceptors != null) { for (int i = 0; i < messageInterceptors.length; i++) { @@ -90,7 +91,7 @@ public class MessageHandlerExecutor { * @throws WeixinException */ public void applyPostHandle(WeixinRequest request, WeixinResponse response, - Object message) throws WeixinException { + WeixinMessage message) throws WeixinException { if (messageInterceptors == null) { return; } @@ -115,7 +116,7 @@ public class MessageHandlerExecutor { * @throws WeixinException */ public void triggerAfterCompletion(WeixinRequest request, - WeixinResponse response, Object message, Exception exception) + WeixinResponse response, WeixinMessage message, Exception exception) throws WeixinException { if (messageInterceptors == null) { return; 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 642ddae2..bfc22159 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 @@ -125,7 +125,7 @@ public class WeixinMessageDispatcher { WeixinMessageKey messageKey = defineMessageKey(messageTransfer, request); Class targetClass = messageMatcher .match(messageKey); - Object message = messageRead(request.getOriginalContent(), targetClass); + WeixinMessage message = messageRead(request.getOriginalContent(), targetClass); logger.info("define '{}' matched '{}'", messageKey, targetClass); MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context, request, messageKey, message, messageTransfer.getNodeNames()); @@ -209,17 +209,17 @@ public class WeixinMessageDispatcher { */ protected MessageHandlerExecutor getHandlerExecutor( ChannelHandlerContext context, WeixinRequest request, - WeixinMessageKey messageKey, Object message, Set nodeNames) + WeixinMessageKey messageKey, WeixinMessage message, Set nodeNames) throws WeixinException { WeixinMessageHandler[] messageHandlers = getMessageHandlers(); if (messageHandlers == null) { return null; } + logger.info("resolve handlers '{}'", this.messageHandlerList); List matchedMessageHandlers = new ArrayList(); for (WeixinMessageHandler handler : messageHandlers) { if (handler.canHandle(request, message, nodeNames)) { matchedMessageHandlers.add(handler); - break; } } if (matchedMessageHandlers.isEmpty()) { @@ -233,6 +233,7 @@ public class WeixinMessageDispatcher { return m2.weight() - m1.weight(); } }); + logger.info("matched message handlers '{}'", matchedMessageHandlers); return new MessageHandlerExecutor(context, matchedMessageHandlers.get(0), getMessageInterceptors()); } @@ -254,9 +255,20 @@ public class WeixinMessageDispatcher { } if (beanFactory != null) { for (Class clazz : messageHandlerClass) { - messageHandlerList - .add((WeixinMessageHandler) beanFactory - .getBean(clazz)); + try { + messageHandlerList + .add((WeixinMessageHandler) beanFactory + .getBean(clazz)); + } catch (RuntimeException ex) { // multiple + for (Object o : beanFactory.getBeans(clazz) + .values()) { + if (o.getClass() == clazz) { + messageHandlerList + .add((WeixinMessageHandler) o); + break; + } + } + } } } else { for (Class clazz : messageHandlerClass) { @@ -305,9 +317,20 @@ public class WeixinMessageDispatcher { } if (beanFactory != null) { for (Class clazz : messageInterceptorClass) { - messageInterceptorList - .add((WeixinMessageInterceptor) beanFactory - .getBean(clazz)); + try { + messageInterceptorList + .add((WeixinMessageInterceptor) beanFactory + .getBean(clazz)); + } catch (RuntimeException ex) { // multiple + for (Object o : beanFactory.getBeans(clazz) + .values()) { + if (o.getClass() == clazz) { + messageInterceptorList + .add((WeixinMessageInterceptor) o); + break; + } + } + } } } else { for (Class clazz : messageInterceptorClass) { diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java index c5155a1b..70549ba6 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java @@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.handler; import java.util.Set; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.TextResponse; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -25,13 +26,13 @@ public class DebugMessageHandler implements WeixinMessageHandler { } @Override - public boolean canHandle(WeixinRequest request, Object message, + public boolean canHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) throws WeixinException { return true; } @Override - public WeixinResponse doHandle(WeixinRequest request, Object message, + public WeixinResponse doHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) throws WeixinException { String content = message == null ? request.getOriginalContent() .replaceAll("\\!\\[CDATA\\[", "").replaceAll("\\]\\]", "") diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java index fa89a873..4012087d 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java @@ -22,10 +22,10 @@ public abstract class MessageHandlerAdapter implements WeixinMessageHandler { @Override - public boolean canHandle(WeixinRequest request, Object message, + public boolean canHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) throws WeixinException { return message != null - && message.getClass() == ClassUtil.getGenericType(this) + && message.getClass() == ClassUtil.getGenericType(getClass()) && canHandle0(request, (M) message); } @@ -36,7 +36,7 @@ public abstract class MessageHandlerAdapter implements * 微信请求 * @param message * 微信消息 - * @return true则执行doHandler + * @return true则执行doHandler0 * @throws WeixinException */ public boolean canHandle0(WeixinRequest request, M message) @@ -45,8 +45,9 @@ public abstract class MessageHandlerAdapter implements } @Override - public WeixinResponse doHandle(WeixinRequest request, Object message, - Set nodeNames) throws WeixinException { + public WeixinResponse doHandle(WeixinRequest request, + WeixinMessage message, Set nodeNames) + throws WeixinException { return doHandle0(request, (M) message); } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/WeixinMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/WeixinMessageHandler.java index 4f728e12..019965e2 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/WeixinMessageHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/WeixinMessageHandler.java @@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.handler; import java.util.Set; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -28,7 +29,7 @@ public interface WeixinMessageHandler { * 节点名称集合 * @return true则执行doHandle */ - public boolean canHandle(WeixinRequest request, Object message, + public boolean canHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) throws WeixinException; /** @@ -42,7 +43,7 @@ public interface WeixinMessageHandler { * 节点名称集合 * @return 回复内容 */ - public WeixinResponse doHandle(WeixinRequest request, Object message, + public WeixinResponse doHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) throws WeixinException; /** diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java index cfdc10f5..833d0649 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java @@ -4,6 +4,7 @@ import io.netty.channel.ChannelHandlerContext; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -21,20 +22,20 @@ public abstract class MessageInterceptorAdapter implements @Override public boolean preHandle(ChannelHandlerContext context, - WeixinRequest request, Object message, WeixinMessageHandler handler) + WeixinRequest request, WeixinMessage message, WeixinMessageHandler handler) throws WeixinException { return true; } @Override public void postHandle(ChannelHandlerContext context, - WeixinRequest request, WeixinResponse response, Object message, + WeixinRequest request, WeixinResponse response, WeixinMessage message, WeixinMessageHandler handler) throws WeixinException { } @Override public void afterCompletion(ChannelHandlerContext context, - WeixinRequest request, WeixinResponse response, Object message, + WeixinRequest request, WeixinResponse response, WeixinMessage message, WeixinMessageHandler handler, Exception exception) throws WeixinException { } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java index ddf13fb6..541bcba8 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java @@ -4,6 +4,7 @@ import io.netty.channel.ChannelHandlerContext; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -33,7 +34,7 @@ public interface WeixinMessageInterceptor { * @throws WeixinException */ boolean preHandle(ChannelHandlerContext context, WeixinRequest request, - Object message, WeixinMessageHandler handler) + WeixinMessage message, WeixinMessageHandler handler) throws WeixinException; /** @@ -52,7 +53,7 @@ public interface WeixinMessageInterceptor { * @throws WeixinException */ void postHandle(ChannelHandlerContext context, WeixinRequest request, - WeixinResponse response, Object message, + WeixinResponse response, WeixinMessage message, WeixinMessageHandler handler) throws WeixinException; /** @@ -71,7 +72,7 @@ public interface WeixinMessageInterceptor { * @throws WeixinException */ void afterCompletion(ChannelHandlerContext context, WeixinRequest request, - WeixinResponse response, Object message, + WeixinResponse response, WeixinMessage message, WeixinMessageHandler handler, Exception exception) throws WeixinException; 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 e86c19fc..e0a925af 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 @@ -12,8 +12,8 @@ import java.lang.reflect.Type; import java.net.JarURLConnection; import java.net.URISyntaxException; import java.net.URL; +import java.util.ArrayList; import java.util.Enumeration; -import java.util.LinkedList; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -75,7 +75,7 @@ public final class ClassUtil { * @return */ private static List> findClassesByFile(File dir, String packageName) { - List> classes = new LinkedList>(); + List> classes = new ArrayList>(); File[] files = dir.listFiles(new FilenameFilter() { @Override public boolean accept(File file, String name) { @@ -111,23 +111,21 @@ public final class ClassUtil { */ private static List> findClassesByJar(JarFile jar, String packageName) { - List> classes = new LinkedList>(); + List> classes = new ArrayList>(); Enumeration jarEntries = jar.entries(); while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); if (jarEntry.isDirectory()) { continue; } - String entryName = jarEntry.getName(); - if (!entryName.startsWith(packageName)) { - continue; - } - if (!entryName.endsWith(CLASS)) { + String className = jarEntry.getName() + .replace(File.separator, POINT); + if (!className.startsWith(packageName) + || !className.endsWith(CLASS)) { continue; } try { - classes.add(Class.forName(entryName.replace(File.separator, - POINT).replace(CLASS, ""))); + classes.add(Class.forName(className.replace(CLASS, ""))); } catch (ClassNotFoundException e) { ; } @@ -177,15 +175,17 @@ public final class ClassUtil { * @param object * @return */ - public static Class getGenericType(Object object) { - Class clazz = null; - Type type = object.getClass().getGenericSuperclass(); + public static Class getGenericType(Class clazz) { + if(clazz == Object.class){ + return null; + } + Type type = clazz.getGenericSuperclass(); if (type instanceof ParameterizedType) { ParameterizedType ptype = ((ParameterizedType) type); Type[] args = ptype.getActualTypeArguments(); - clazz = (Class) args[0]; + return (Class) args[0]; } - return clazz; + return getGenericType(clazz.getSuperclass()); } public static ClassLoader getDefaultClassLoader() { diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java index 369140b1..c363f1cd 100644 --- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java +++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java @@ -1,13 +1,18 @@ package com.foxinmy.weixin4j.server.test; +import java.util.Set; + import io.netty.channel.ChannelHandlerContext; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.DebugMessageHandler; import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; +import com.foxinmy.weixin4j.handler.MultipleMessageHandlerAdapter; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor; import com.foxinmy.weixin4j.message.TextMessage; +import com.foxinmy.weixin4j.mp.event.ScanEventMessage; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.TextResponse; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -84,7 +89,7 @@ public class MessageServerStartup { WeixinMessageInterceptor interceptor = new WeixinMessageInterceptor() { @Override public boolean preHandle(ChannelHandlerContext context, - WeixinRequest request, Object message, + WeixinRequest request, WeixinMessage message, WeixinMessageHandler handler) throws WeixinException { context.writeAndFlush(new TextResponse("所有消息被拦截了!")); return false; @@ -93,7 +98,7 @@ public class MessageServerStartup { @Override public void postHandle(ChannelHandlerContext context, WeixinRequest request, WeixinResponse response, - Object message, WeixinMessageHandler handler) + WeixinMessage message, WeixinMessageHandler handler) throws WeixinException { System.err.println("preHandle返回为true,执行handler后"); } @@ -101,7 +106,7 @@ public class MessageServerStartup { @Override public void afterCompletion(ChannelHandlerContext context, WeixinRequest request, WeixinResponse response, - Object message, WeixinMessageHandler handler, + WeixinMessage message, WeixinMessageHandler handler, Exception exception) throws WeixinException { System.err.println("请求处理完毕"); } @@ -115,7 +120,22 @@ public class MessageServerStartup { .openAlwaysResponse().startup(); } + @SuppressWarnings("unchecked") + public void test6() throws WeixinException { + MultipleMessageHandlerAdapter messageHandler = new MultipleMessageHandlerAdapter( + ScanEventMessage.class, TextMessage.class) { + @Override + public WeixinResponse doHandle(WeixinRequest request, + WeixinMessage message, Set nodeNames) + throws WeixinException { + return new TextResponse("处理了扫描和文字消息"); + } + }; + new WeixinServerBootstrap(token).addHandler(messageHandler, + DebugMessageHandler.global).startup(); + } + public static void main(String[] args) throws Exception { - new MessageServerStartup().test1(); + new MessageServerStartup().test6(); } }