diff --git a/src/main/java/com/jfinal/weixin/sdk/api/ApiConfigKit.java b/src/main/java/com/jfinal/weixin/sdk/api/ApiConfigKit.java index 9ab5219351c3c12c224ad941223ce921abfa4c67..d0a9d8df456795a54ae38b72d86635455e413700 100644 --- a/src/main/java/com/jfinal/weixin/sdk/api/ApiConfigKit.java +++ b/src/main/java/com/jfinal/weixin/sdk/api/ApiConfigKit.java @@ -1,19 +1,19 @@ package com.jfinal.weixin.sdk.api; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import com.jfinal.kit.StrKit; import com.jfinal.log.Log; import com.jfinal.weixin.sdk.cache.DefaultAccessTokenCache; import com.jfinal.weixin.sdk.cache.IAccessTokenCache; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 将 ApiConfig 绑定到 ThreadLocal 的工具类,以方便在当前线程的各个地方获取 ApiConfig 对象: * 1:如果控制器继承自 MsgController 该过程是自动的,详细可查看 MsgInterceptor 与之的配合 * 2:如果控制器继承自 ApiController 该过程是自动的,详细可查看 ApiInterceptor 与之的配合 * 3:如果控制器没有继承自 MsgController、ApiController,则需要先手动调用 - * ApiConfigKit.setThreadLocalAppId(appId) 来绑定 appId 到线程之上 + * ApiConfigKit.setThreadLocalAppId(appId) 来绑定 appId 到线程之上 */ public class ApiConfigKit { private static final Log log = Log.getLog(ApiConfigKit.class); @@ -37,6 +37,7 @@ public class ApiConfigKit { /** * 添加公众号配置,每个appId只需添加一次,相同appId将被覆盖。 * 第一个添加的将作为默认公众号配置 + * * @param apiConfig 公众号配置 * @return ApiConfig 公众号配置 */ @@ -52,7 +53,36 @@ public class ApiConfigKit { } public static ApiConfig removeApiConfig(String appId) { - return CFG_MAP.remove(appId); + ApiConfig removedConfig = CFG_MAP.remove(appId); + if (removedConfig != null) { + ApiConfig defaultApiConfig = CFG_MAP.get(DEFAULT_CFG_KEY); + + if (defaultApiConfig.getAppId().equals(removedConfig.getAppId())) { + + CFG_MAP.remove(DEFAULT_CFG_KEY); + + ApiConfig firstApiConfig = null; + if (CFG_MAP.size() > 0) { + for (Map.Entry entry : CFG_MAP.entrySet()) { + firstApiConfig = entry.getValue(); + break; + } + } + + if (firstApiConfig != null) { + CFG_MAP.put(DEFAULT_CFG_KEY, firstApiConfig); + } + } + } + + return removedConfig; + } + + /** + * 清除所有的配置,一般情况下用在动态的支持添加或者修改配置的时候 + */ + public static void removeAll() { + CFG_MAP.clear(); } public static void setThreadLocalAppId(String appId) { @@ -82,9 +112,10 @@ public class ApiConfigKit { public static ApiConfig getApiConfig(String appId) { log.debug("appId: " + appId); ApiConfig cfg = CFG_MAP.get(appId); - if (cfg == null) + if (cfg == null) { throw new IllegalStateException("需事先调用 ApiConfigKit.putApiConfig(apiConfig) 将 appId对应的 ApiConfig 对象存入," + - "如JFinalConfig.afterJFinalStart()中调用, 才可以使用 ApiConfigKit.getApiConfig() 系列方法"); + "如JFinalConfig.afterJFinalStart()中调用, 才可以使用 ApiConfigKit.getApiConfig() 系列方法"); + } return cfg; }