我按照步骤部署DrEdit for Java:
https://github.com/googledrive/dredit/tree/master/java
当我访问应用程序时,我在AppEngine日志控制台中收到此错误!
2013-10-02 12:51:08.404
/start
java.lang.NullPointerException
at com.google.drive.samples.dredit.DrEditServlet.loginIfRequired(DrEditServlet.java:149)
at com.google.drive.samples.dredit.StartPageServlet.doGet(StartPageServlet.java:46)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
这是第149行。credentialManager为空。
protected void loginIfRequired(HttpServletRequest req,
HttpServletResponse resp) {
Credential credential = getCredential(req, resp);
if (credential == null) {
// redirect to authorization url
try {
resp.sendRedirect(credentialManager.getAuthorizationUrl()); // line 149
它应该在init()
中设置 public void init() throws ServletException {
super.init();
// init credential manager
credentialManager = new CredentialManager(
getClientSecrets(), TRANSPORT, JSON_FACTORY);
}
我无法使用System.out.println,因为它永远不会显示在日志中,即使我选择了“所有请求”。
我也得到NoSuchMethodError:
Error for /
java.lang.NoSuchMethodError: com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(Lcom/google/api/client/json/JsonFactory;Ljava/io/InputStream;)Lcom/google/api/client/googleapis/auth/oauth2/GoogleClientSecrets;
at com.google.drive.samples.dredit.DrEditServlet.getClientSecrets(DrEditServlet.java:249)
at com.google.drive.samples.dredit.DrEditServlet.init(DrEditServlet.java:88)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
这恰好是一行:
249 return GoogleClientSecrets.load(JSON_FACTORY, stream);
我应该提一下,当我访问localhost时,它在本地运行正常:8888 / start,因为它只是将我发送给Google进行身份验证,但当它尝试重定向到appspot.com/oauth2callback时当然失败了。
答案 0 :(得分:1)
“NoSuchMethodError”可能与您复制/粘贴的代码与已安装的Google Oauth库的版本不匹配。我的猜测是该库已更新,但谷歌没有返回并更新DrEdit示例。如果您将Eclipse与Google插件一起使用,它将为您获取最新的库。
关于你的最后一点,要在本地服务器上测试oauth,有一些技巧。
选项1。在本地/ etc / hosts文件(或等效文件)127.0.0.1 dev.example.com
中创建一个条目。然后,您可以在API控制台中将dev.example.com配置为回调URL。
选项2。使用goo.gl为localhost创建缩短的URL:8000 / mycallbackservlet然后,您可以在API控制台中将缩短的URL配置为回调URL。 (注意,我使用选项1,所以没有亲自尝试过。)
在这两种情况下,您都需要修改代码以感知它在本地devserver上运行并相应地调整其回调URL。
关于你的NPE问题,显然很难说没有进一步的信息,但我的2c是DrEdit不是理解oauth的一个很好的切入点。
HTH
答案 1 :(得分:0)
目前,我还在研究DrEdit代码,我已经完成了错误,因为没有这样的方法 - 返回GoogleClientSecrets.load(JSON_FACTORY,stream);
我在此声明之前添加了一行作为 -
更正了代码InputStream stream = getServletContext().getResourceAsStream(CLIENT_SECRETS_FILE_PATH);
InputStreamReader reader = new InputStreamReader(stream); //I have added this line.
try {
return GoogleClientSecrets.load(JSON_FACTORY, reader); //initially it was stream. I changed it to reader.
这解决了我没有这样的方法问题。我不确定你得到的NPE。希望这个小小的修正,也能解决你的问题。