2009-09-22 7 views
0

J'écris une application Web Twitter en utilisant Twitter4J sur GAE/J. Je sauvegarde les objets Twitter et Request Token en session afin qu'ils soient utilisés après un rappel.Problème HttpSession dans Google App Engine/J

J'ai deux servlets. IndexServlet définit la session et HomeServlet obtient de la session (hits sur rappel par twitter oAuth).

Si je commente des lignes de gestion de session dans les deux servlets, les rappels fonctionnent correctement.

S'il vous plaît suggérer une solution de contournement. Je partage mon code ici.

IndexServlet.java

Twitter twitter = new Twitter(); 
       twitter.setOAuthConsumer("<masked>", "<masked>"); 
       RequestToken requestToken = null; 
      try { 
        requestToken = twitter.getOAuthRequestToken(); 
        log.info("OAuth token has been taken"); 
      } catch (TwitterException e) { 
        log.warning(e.toString()); 
      } 

      HttpSession session = request.getSession(); 
      if (session.getAttribute("twitter")==null){ 
        session.setAttribute("twitter", twitter); 
        out.println("-----------------------------> session is set"); 
      } 

      if (session.getAttribute("token")==null){ 
        session.setAttribute("token", requestToken); 
        out.println("-----------------------------> session is set"); 
      } 
      String authUrl = requestToken.getAuthorizationURL(); 

HomeServlet.java

     HttpSession session = request.getSession(); 

        twitter = (Twitter)session.getAttribute("twitter"); 
        r = (RequestToken)session.getAttribute("token"); 

        twitter.setOAuthAccessToken(r.getAccessToken()); 

        twitter.updateStatus("Hello World!"); 

Exception

javax.servlet.ServletException: java.lang.ArrayStoreException: [Ljava.lang.String; 
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:239) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
at org.mortbay.jetty.Server.handle(Server.java:313) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) 
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) 
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139) 
at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235) 
at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4950) 
at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4948) 
at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) 
at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359) 
at com.google.net.rpc.impl.Server$2.run(Server.java:823) 
at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) 

Répondre

1

Si la mise en sessions à true dans AppEngine ne fonctionne pas alors obtenir le jeton et tokenSecret du requestToken

Twitter twitter = new Twitter(); 
twitter.setOAuthConsumer(consumerKey,consumerSecret); 
RequestToken requestToken = twitter.getOAuthRequestToken(); 

String token = requestToken.getToken(); 
String tokenSecret = requestToken.getTokenSecret(); 

HttpSession session = request.getSession(); 
session.setAttribute("token",token); 
session.setAttribute("tokenSecret",tokenSecret); 

Dans votre HomeServlet récupérer le jeton et tokenSecret de la session:

Twitter twitter = new Twitter(); 
twitter.setOAuthConsumer(consumerKey,consumerSecret); 
AccessToken accessToken = 
    twitter.getOAuthAccessToken(token, tokenSecret); 
twitter.setOAuthAccessToken(accessToken); 

J'ai aussi essayé de stocker des objets twitter et requestToken avant, mais cela n'a pas fonctionné pour moi. Mais ce code que je viens de vous montrer l'a fait. J'ai un tutoriel publié ici BTW: http://jeungun.wordpress.com/2009/09/03/quick-and-dirty-twitter4j-oauth-for-web-apps/

0

reche ck que vous avez

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
... 
    <sessions-enabled>true</sessions-enabled> 
... 
</appengine-web-app> 

dans votre guerre/WEB-INF/lib/appengine-web.xml

+0

Oui, j'oublié de mentionner, mais je lui ont permis dans le fichier xml appengin. –

Questions connexes