2013-10-05 4 views
1

Я пытаюсь внедрить процесс входа в Twitter. Во время процесса регистрации пользователь должен быть перенаправлен на веб-сайт Twitter, чтобы ввести свои учетные данные, а затем он будет перенаправлен на мой URL-адрес веб-сайта. Перед первой перенаправлением экземпляр объекта RequestToken (библиотека Twitter4J) должен храниться и сохраняться между запросами.@ConversationScope bean не сохраняет ссылочные значения

Для этого я решил использовать ConverstaionScoped bean, но, к сожалению, значения ссылок не сохраняются между запросами.

Вот мои JSF страницы:

twitter.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     > 

    <f:event listener="#{twitterLoginPageController.login()}" type="preRenderView" /> 

</html> 

twitterRedirect.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     > 

    <f:event listener="#{twitterLoginPageController.onRedirect(param.oauth_token, param.oauth_verifier)}" type="preRenderView" /> 

</html> 

Мой Twitter Войти контроллер:

@Named 
@ConversationScoped 
public class TwitterLoginPageController implements Serializable { 


    @Inject 
    private Conversation conversation; 

    // These objects should be retained between requests 
    Twitter twitter; 
    RequestToken requestToken; 

    public void login() { 

     try { 
      twitter = new TwitterFactory().getInstance(); 
      requestToken = twitter.getOAuthRequestToken("..."); 


      conversation.begin(); 
      conversation.setTimeout(30000); 
      // Navigate to Twitter here 
     } catch (TwitterException ex) { 
      ... 
     } 

    } 

    public void onRedirect(String oauthToken, String oauthVerifier) {  
     try { 
      // twitter reference is null here 
      twitter.getOAuthAccessToken(requestToken, oauthVerifier); 
      ... 
     } catch (TwitterException e) { 
      ... 
     } finally { 
      conversation.end(); 
     } 

    } 
} 

кажется мне, что я следую примеры использования @ConverstaionScope тесно, но я не могу получить ожидаемый результат. Что делать, чтобы сохранить объекты между запросами?

ответ

5

Я не знаком с Twitter или с Twitter4J специально, но поскольку это твиттер, который перенаправляет пользователя обратно в ваше приложение, вы должны передать twitter идентификатор беседы таким образом, чтобы twitter перенаправлял пользователя обратно на URL-адрес, который включает в себя Я бы.

Контейнер Java EE поддерживает состояние разговора, передавая параметр cid=..., и это происходит автоматически для навигации JSF, но в противном случае вы должны позаботиться об этом. Поэтому убедитесь, что вы получили conversation id после того, как вы начали разговор и передали его в Twitter, чтобы twitter перенаправлял пользователя на twitterRedirect.xhtml?cid=....

+0

Отлично! Это решило мою проблему! Используя API Twitter, вы можете указать параметры в URL-адресе обратного вызова, например: requestToken = twitter.getOAuthRequestToken (".../twitterRedirect.xhtml? Cid =" + convers.getId()); –

+0

@ IvanMushketyk Я так и думал, но не хотел предполагать. Рад, что это помогло! – rdcrng