我想知道AppEngine灵活环境是否支持来自com.google.api-client的AbstractAppEngineAuthorizationCodeCallbackServlet。
我正在从不推荐的环境(vm:true)迁移到最新版本的Flexible Environment(env:flex)。
当访问从AbstractAppEngineAuthorizationCodeServlet扩展的我的一个servlet时,流程完美地工作,并且重定向完成到从AbstractAppEngineAuthorizationCodeCallbackServlet扩展的其他servlet。现在,当它试图运行时:
TokenResponse response = flow.newTokenRequest(code).setRedirectUri(redirectUri).execute();
(来自AbstractAuthorizationCodeCallbackServlet类的doGet内部的行)
它回复了一次:
com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call urlfetch.Fetch in a thread that is neither the original request thread nor a thread created by ThreadManager
更新
我可以在Cloud Console上查看我的实例确实在Flexible上运行。
答案 0 :(得分:1)
我刚刚发现了lib使用的错误
在创建GoogleAuthorizationCodeFlow对象时,我传递了一个GoogleClientSecrets:
Builder(HttpTransport transport, JsonFactory jsonFactory, GoogleClientSecrets clientSecrets, Collection<String> scopes)
出于某种原因,将id和secret作为字符串传递(使用Builder的其他构造函数),它可以工作。
GoogleAuthorizationCodeFlow.Builder(HttpTransport, JsonFactory, String, String, Collection<String> scopes)
不确定原因。
------------------------------------- EDIT --------- --------------------------
我刚看到这里除了使用GoogleClientSecrets对象之外我做了另一个更改。
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final UrlFetchTransport HTTP_TRANSPORT = new UrlFetchTransport();
使用UrlFetchTransport而不是NetHttpTransport是显示堆栈跟踪的真正原因。