开发者社区> 问答> 正文

jfinal_weixin获取accesstoken的问题.会是一个框架源码本身的bug?:配置报错

jfinal-weixin 最新版,及最新测试代码.

package com.jfinal.weixin.sdk.api;

import java.io.IOException;

/** * AccessTokenApi 测试 */ public class AccessTokenApiTest {

public static void main(String[] args) throws IOException {
	ApiConfig ac = new ApiConfig();
	ac.setAppId("wx5d6604a5d4cfaee93");// 这是一个错误的appid
	ac.setAppSecret("ff7971a6fd9dc409d185e81c63025799");// 密码
	// ac.setAppId("wx9803d1188fa5fbda");
	// ac.setAppSecret("db859c968763c582794e7c3d003c3d87");
	ApiConfigKit.setThreadLocalApiConfig(ac);

	AccessToken at = AccessTokenApi.getAccessToken();

	System.out.println(at.getJson());

	if (at.isAvailable()) {
		System.out.println("access_token : " + at.getAccessToken());// token值
		System.out.println("getExpiresIn : " + at.getExpiresIn());// 超时时间,单位为秒
		System.out.println("getJson : " + at.getJson());

	} else {
		System.out.println(at.getErrorCode() + " : " + at.getErrorMsg());
	}
}

}

我测试以上代码,发现会发生死循环.导致jvm宕掉.

然后我断点看一下执行过程.
1. com.jfinal.weixin.sdk.api.AccessTokenApi getAccessToken会先执行.然后getAccessToken获取到的值无效的话,再去执行refreshAccessToken这个方法. 2.refreshAccessToken 方法原意是重试3次. 就放弃. 但问题是 String json = HttpKit.get(url, queryParas); result = new AccessToken(json);// 此处代码里面封装了一个apiresult对象.而ApiResult里面有可能会调用refreshAccessTokenIfInvalid方法.然后refreshAccessTokenIfInvalid这个方法又会有机会重新执行
refreshAccessToken .这样死循环就重现了

问题重现很容易,在测试代码里面,把appid输错一个数字就出现了.
请各位看一下,这是不是一个问题?或者有什么好的方法规避一下?

@JFinal

展开
收起
kun坤 2020-05-31 22:43:31 1205 0
1 条回答
写回答
取消 提交回答
  • 已经修改,感谢反馈!######好像有这个问题######      刚看了一下代码,应该不会有这个问题,refreshAccessToken() 方法中并没有 ApiResult 的操作,AccessToken 中也没有 ApiResult 的操作,所以如果 access token 获取失败三次调用流程就会终止。
        可能是其它原因引起的问题,希望楼主调试一下程序,找到原因后来此再分享一下。 ######
    //截图重新压缩后,有点模糊了.
    james,就是上面那个执行流程形成了回路.
    不知道把刷新token的方法

    void com.jfinal.weixin.sdk.api.ApiResult.refreshAccessTokenIfInvalid()

    放回这个类本身

    com.jfinal.weixin.sdk.api.AccessToken

    会不会显得更加直接一点.这样ApiResult构造方法变为

    @SuppressWarnings("unchecked") public ApiResult(String jsonStr) { this.json = jsonStr;

    	try {
    		Map<String, Object> temp = JsonUtils.decode(jsonStr, Map.class);
    		this.attrs = temp;
    		
    		// 如果需要,刷新token
    

    //这里注释掉就OK. //refreshAccessTokenIfInvalid(); } catch (Exception e) { throw new RuntimeException(e); } }

    ######我本地的代码是没有ApiResult 这部分代码的,刚看了一下是线上的有这个代码,团队开发出了点小状况######我本地是没有的,团队开发出了点小状况 ######嘿嘿,没注意这块,目前已经修改了

    2020-05-31 22:43:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载