2013-05-13 6 views
1

Я использую Twitter4j для создания Twitter-клиента с JSP и серватами. Когда я запрашиваю токен доступа, я получаю следующее исключение: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()); 

Это StackTrace

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

Является ли URL-адрес обратного вызова тем же самым, что вы настроили в консоли Twitter API? – Driver

+0

Нет обратного URL в Twitter API Консоль совершенно другая. Его манекен –

+0

Как сказал @Driver, вы должны использовать тот же URL обратного вызова, который вы ввели в конфигурацию вашего API Twitter. – Kongol

ответ

0

я встретил подобную проблему недавно и отлаживать исходный код построчно. Наконец, я обнаружил, что конфигурация займет несколько источников до ее готовности. При установке свойства, таких как consumerKey, consumerSecret, это создало бы из этих линий

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

Кроме того, twitter4j будет сканировать и найти путь к классам в собственность файлов которых определяют соответствующие ключевые пары значений. Я создал этот файл, следуя инструкциям учебника, и я забыл удалить это. Но в учебнике он просто рассказал вам, как получить доступ к api сгенерированными accessToken и accessSecret, которые были причиной исключения IllegalStatusException.

После того, как я нашел эту проблему, я удалил ключи accessToken и accessTokenSecret в файле свойств. Тогда проблема решена.

Надеюсь, это может вам помочь.

0

Я столкнулся с такой же проблемой, потому что токен доступа уже доступен в построителе конфигурации. поэтому вам нужно установить его как null в конфигурационном построителе

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()); 

с помощью этого кода можно запустить программу должным образом.

Смежные вопросы