1

JSP とサーブを使用して Twitter クライアントを作成するために Twitter4j を使用しています。アクセス トークンを要求すると、次の例外が発生します。

java.lang.IllegalStateException: Access token already available.

次に、Stack Overflow で検索しました。私は著者が書いた解決策でこの投稿を受け取りました:

Configuration Builder によってハードコードされた Access Token を設定していました。

しかし、彼らはそれをどのように修正したかについては言及していません.私はアクセストークンをハードコーディングしていません. これが私のコードです

 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)
4

2 に答える 2

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

このコードを使用すると、プログラムを適切に実行できます。

于 2016-07-18T05:42:09.470 に答える
0

最近同様の問題に遭遇し、ソースコードを1行ずつデバッグしました。最終的に、構成の準備が整うまでに複数のソースが必要になることがわかりました。consumerKey、consumerSecret などのプロパティを設定する場合、これらの行から設定されます。

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

さらに、twitter4j はクラスパスをスキャンし、関連するキーと値のペアを定義するプロパティ ファイルを見つけます。チュートリアルの指示に従ってこのファイルを作成しましたが、これを削除するのを忘れています。しかし、チュートリアルでは、IllegalStatusException の原因となった、生成された accessToken と accessSecret を使用して API にアクセスする方法を説明しただけです。

この問題を発見した後、プロパティ ファイルの accessToken および accessTokenSecret キーを削除しました。その後、問題は解決しました。

これがあなたを助けることを願っています。

于 2013-07-17T06:25:39.497 に答える