开发者社区> 问答> 正文

jfinal获取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

展开
收起
montos 2020-06-02 20:35:22 553 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-06-02 20:35:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第7讲】:Spring Boot 2.0安全机制与MVC身份验证实战(Java面试题) 立即下载
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战 立即下载
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载