关于WeiXin v1.9的ApiConfigKit感觉用起来很别扭!

主要区别在MsgInterceptor跟ApiInterceptor这两个拦截器上

原来1.8版本,是下面的方式一次性将ApiConfig绑定到ThreadLocal

ApiConfigKit.setThreadLocalApiConfig(ApiConfig apiConfig)

需要ApiConfig的时候可以从ThreadLocal中一次取出


现在1.9的版本,是只将ApiConfig中的appId绑定到ThreadLocal

ApiConfigKit.setThreadLocalAppId(String appId)

需要ApiConfig的时候,根据绑定的appId再从Map中获取完整的ApiConfig。

当然这个Map需要在JFinal.afterStart中预先初始化,方法是:

ApiConfigKit.putApiConfig(ApiConfig apiConfig)


这么改进的用意还不太清楚,可能是减少了ThreadLocal的数据量,提高了性能

但在实际项目中很麻烦

主要有两点:

1、通常appId跟其他ApiConfig信息是保存一张表里,每个会话从数据库中获取appId跟获取整个ApiConfig没有区别

2、ApiConfigKit只能将appId作为获取ApiConfig的MapKey,非常不灵活。通常项目中,肯定会存在一个用户ID或者单位ID,这个ID才会贯穿项目始终,而ApiConfig表中的外键也会是这个ID,如果使用这个ID来作为MapKey来检索ApiConfig才更加符合要求。

说了这么多,其实就想将ApiConfigKit中的putApiConfig方法修改如下:

//当前1.9:
//public static ApiConfig putApiConfig(ApiConfig apiConfig) {...}
//修改后:
public static ApiConfig putApiConfig(String apiKey, ApiConfig apiConfig) {...}

很高兴1.9增加了智能硬件等新接口支持,但感觉ApiConfigKit部分1.8已经做的足够好了

评论区

JFinal

2017-05-30 12:26

其实我也有这个疑问,呼出 1.9 版本的春梦大神 @如梦技术 @dreamlu

netwild

2017-05-31 09:32

再次呼唤春梦大神 @dreamlu

Dreamlu

2017-05-31 09:55

这块我只能说习惯就好,现在控制器不用重写getApiConfig,用户只需要启动时put进去。另外这块时别的朋友贡献的,我起初也是抵触状态,后来试用了下其实还不错。

netwild

2017-05-31 15:23

@Dreamlu 懂了,那我只能暂时用1.8了。其实这种方式也不错,除了用appId做MapKey。

hmgx

2017-09-09 15:37

1.9版本的如何支持多个公众号,我看说是 重写 getApiConfig 方法,好像没有找到阿

netwild

2017-09-11 13:25

@hmgx 看这里http://www.edaoe.com/1183.html

hmgx

2017-09-11 19:18

找到了,多谢,在问个新问题。
WxaConfig wc = new WxaConfig();
wc.setAppId("wxf4sffsfgds0265ebc9");
wc.setAppSecret("1ec2basfdsf6019sfs47d87df");
WxaConfigKit.setWxaConfig(wc);
1.9的版本这里配置 的是 微信小程序 ?然后 配置后要怎么使用呢?

netwild

2017-09-12 07:49

小程序的还没研究,公众号的是从Controller中获取appId:getPara("appid")

huozaimengli

2018-04-12 16:31

先在afterJFinalStart()方法中 调用一次putApiConfig()(含token,APPID,APPsecret),然后再MenuManager.main()中再调用一次putApiConfig(),APPID 和 APPsecret与第一次调用的相同,但是token 为null, token会被覆盖,最终为null,导致token验证失败。。。请问是会覆盖吗????一个项目中没有此问题,另一个项目中出现了这个问题 @Dreamlu

Dreamlu

2018-04-13 10:53

ApiConfigKit 可以再项目启动后任意时刻添加啊,你数据库加的时候把它同步一下,afterJFinalStart 非一定要写在这里面。@netwild 我之前没仔细看这个,putApiConfig(ApiConfig apiConfig)默认 用appid作为 key的,如果你自己要重新 加入其它参数,你重写 ApiConfig 加入你自己的参数 就ok了,我理解这块其实很灵活的,你要的是发散思维。

热门反馈

扫码入社