2013-05-13 64 views
1

我正在使用Twitter4j創建帶有JSP和servets的Twitter客戶端。當我要求訪問令牌時,我收到以下例外情況:Twitter4j:java.lang.IllegalStateException:已有的訪問令牌

java.lang.IllegalStateException: Access token already available. 

然後我搜索了堆棧溢出。我得到了this post作者在解決方案中寫道:

我正在設置由配置生成器硬編碼的訪問令牌。

但他們沒有提到他們如何修復它。我也沒有硬編碼訪問令牌。這裏是我的代碼

StringBuffer callbackURL = request.getRequestURL(); 
System.out.println("callbackurl is" + callbackURL); 

int index = callbackURL.lastIndexOf("/"); 
callbackURL.replace(index, callbackURL.length(), "").append("/callback"); 


ConfigurationBuilder cb = new ConfigurationBuilder(); 
cb.setDebugEnabled(true) 
    .setOAuthConsumerKey(getServletContext().getInitParameter("consumerKey")) 
    .setOAuthConsumerSecret(getServletContext().getInitParameter("consumerSecret")); 

TwitterFactory tf = new TwitterFactory(cb.build()); 
Twitter twitter = tf.getInstance(); 

System.out.println("Twitter is" + twitter); 

request.getSession().setAttribute("twitter", twitter); 

RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString()); 
System.out.println("request token is " + requestToken); 

request.getSession().setAttribute("requestToken", requestToken); 

System.out.println(requestToken.getAuthenticationURL()); 

response.sendRedirect(requestToken.getAuthenticationURL()); 

這是堆棧跟蹤

HTTP ERROR 500 

Problem accessing /Demo1. Reason: 

    Access token already available. 

Caused by: 

java.lang.IllegalStateException: Access token already available. 
    at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:113) 
    at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104) 
    at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:281) 
    at com.example.Demo1.doGet(Demo1.java:69) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:521) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) 
    at org.eclipse.jetty.server.Server.handle(Server.java:349) 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:449) 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:910) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534) 
    at java.lang.Thread.run(Thread.java:679) 
+0

您設置的回調網址是否與您在Twitter API控制檯中配置的相同? – Driver 2013-05-13 09:04:02

+0

Twitter API控制檯中的回撥URL是完全不同的。它是一個虛擬的一個 – 2013-05-13 09:29:48

+0

正如@Driver所說,你必須使用你放入你的Twitter API配置中的相同的回調URL。 – Kongol 2013-05-22 10:43:03

回答

0

我最近遇到類似的問題,我調試通過行的源代碼行。我終於發現配置在準備好之前需要多個來源。當設置屬性,如consumerKey,consumerSecret,它會從這些線路設置

ConfigurationBuilder cb = new ConfigurationBuilder(); 
cb.setDebugEnabled(true) 
    .setOAuthConsumerKey(getServletContext().getInitParameter("consumerKey")) 
    .setOAuthConsumerSecret(getServletContext().getInitParameter("consumerSecret")); 

此外,twitter4j將掃描類路徑,找到屬性文件它定義了相關的鍵值對。我按照教程的說明創建了這個文件,我忘了刪除它。但在教程中,它只是告訴你如何通過生成的accessToken和accessSecret訪問api,這是IllegalStatusException的原因。

當我發現這個問題後,我刪除了屬性文件中的accessToken和accessTokenSecret鍵。然後問題解決了。

希望這可以幫助你。

0

我遇到了同樣的問題,這是因爲訪問令牌已經在配置生成器中可用。因此您需要在配置生成器中將其設置爲空

StringBuffer callbackURL = request.getRequestURL(); 
System.out.println("callbackurl is" + callbackURL); 

int index = callbackURL.lastIndexOf("/"); 
callbackURL.replace(index, callbackURL.length(), "").append("/callback"); 


ConfigurationBuilder cb = new ConfigurationBuilder(); 
cb.setDebugEnabled(true).setOAuthConsumerKey((String) "consumerkey") 
      .setOAuthConsumerSecret("consumersecret").setOAuthAccessToken(null) 
      .setOAuthAccessTokenSecret(null) 
      .setOAuthRequestTokenURL("https://api.twitter.com/oauth/request_token") 
      .setOAuthAuthorizationURL("https://api.twitter.com/oauth/authorize") 
      .setOAuthAccessTokenURL("https://api.twitter.com/oauth/access_token"); 

TwitterFactory tf = new TwitterFactory(cb.build()); 
Twitter twitter = tf.getInstance(); 

System.out.println("Twitter is" + twitter); 

request.getSession().setAttribute("twitter", twitter); 

RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString()); 
System.out.println("request token is " + requestToken); 

request.getSession().setAttribute("requestToken", requestToken); 

System.out.println(requestToken.getAuthenticationURL()); 

response.sendRedirect(requestToken.getAuthenticationURL()); 

使用此代碼可以正常運行程序。