2017-09-21 5 views
0

j'ai un comportement très étrange, je crois avoir deux questions, je les ai mis ensemble sur le même poste, car ils peuvent être liés:Impossible de rediriger les avec le navigateur Vaadin

mon code est:

VaadinSession.getCurrent().setAttribute("user", user); 
System.out.println("User :"+ user); 
getUI().getNavigator().navigateTo(HomePageView.HOMEPAGE); 

1. le premier numéro

Je suis sur la page de connexion, je peux voir mes informations utilisateur, mais je ne peux pas accéder à la page d'accueil. Je n'ai aucune erreur!

Si je supprime la ligne avec le vaadinSession, le navigateur fonctionne ...

2. Deuxième question

J'ai essayé de déboguer mon code, mais j'ai reçu une « source introuvable », pour résoudre ce problème, je suis Eclipse java debugging: source not found. Mais, semble travailler pour moi. Ce que j'ai fait:

  • J'ai recréé un nouvel espace de travail sans succès.
  • Je modifié le chemin de recherche de la source et j'ai mon projet java dans ce
  • Dans les préférences -> Java -> installés JREs -> J'ai JDK 1.8.0
  • faites un clic droit sur le projet -> Maven -> sources de téléchargement
  • faites un clic droit sur le projet -> maven -> désactiver la nature maven et après Configurer -> projet Maven

EDIT: solution pour la question 2: J'étais tellement bloqué ... Je sais que c'est un problème d'éclipse (configuration ou quelque chose comme ça). J'ai changé pour IntelliJ. Cet IDE me montre les sources sans problème.

INFO

J'utilise des services Web Vaadin et REST (avec le javax.ws.rs.client.ClientBuilder). Lorsque j'utilise SYSOUT, j'ai les bonnes informations. J'ai reçu l'information de la page d'accueil (au lieu de la vue semble garder la vue de connexion).

Tout indice sera très utile!


EDIT: classe pleine LoginView

package com.test.project.View; 

import com.test.project.model.User; 
import com.test.project.restclient.RestClient; 
import com.vaadin.annotations.Title; 
import com.vaadin.data.Binder; 
import com.vaadin.data.validator.EmailValidator; 
import com.vaadin.icons.VaadinIcons; 
import com.vaadin.navigator.View; 
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; 
import com.vaadin.server.VaadinSession; 
import com.vaadin.ui.Alignment; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.CustomComponent; 
import com.vaadin.ui.Panel; 
import com.vaadin.ui.TextField; 
import com.vaadin.ui.VerticalLayout; 


    /** 
    * Login View. The user should enter his email address. Extends {@link CustomComponent} and implements {@link View} 
    * 
    * @author Bob 
    */ 
    @Title("Sign Up") 
    public class LoginView extends CustomComponent implements 
      View { 

     private static final long serialVersionUID = 1L; 

     public static final String LOGIN = ""; 

     private VerticalLayout vLayout = new VerticalLayout(); 

     private static final String SIGNUP_LABEL = "Sign Up"; 
     private static final String EMAIL_CAPTION = "Type your email here :"; 
     private static final String SIGNIN_LABEL = "Sign In"; 
     private TextField email; 
     private static final String TOKEN_ATTRIBUTE_LABEL = "token"; 

     private final Binder<User> binder = new Binder<>(); 
     private User user; 

     private Button loginButton; 

     /** 
     * Login view Constructor 
     */ 
     public LoginView() { 
      createLoginPanel(); 
      addListener(); 
     } 

     /** 
     * Add Listener concern by the Login View Fields 
     */ 
     private void addListener() { 
      loginButton.addClickListener(e -> { 
       RestClient rc = new RestClient(); 
       user = rc.getUserInfo(email.getValue()); 
       VaadinSession.getCurrent().setAttribute(TOKEN_ATTRIBUTE_LABEL, user.getToken()); 
       System.out.println(); 
       getUI().getNavigator().navigateTo(HomePageView.HOMEPAGE); 
      }); 
     } 

     /** 
     * Create the login panel with the email field and the login button 
     */ 
     private void createLoginPanel() { 
      final VerticalLayout layout = new VerticalLayout(); 
      layout.setSizeFull(); 

      Panel panel = new Panel(SIGNUP_LABEL); 
      panel.setHeight(200, Unit.PIXELS); 
      panel.setWidth(300, Unit.PIXELS); 

      email = new TextField(); 
      email.setCaption(EMAIL_CAPTION); 
      email.setHeight(30, Unit.PIXELS); 
      email.setWidth(275, Unit.PIXELS); 
      binder.forField(email).withValidator(new EmailValidator("This doesn't look like a valid email address")).bind(User::getEmail, User::setEmail); 

      loginButton = new Button(SIGNIN_LABEL); 
      loginButton.setIcon(VaadinIcons.SIGN_IN); 

      layout.addComponents(email, loginButton); 
      layout.setComponentAlignment(loginButton, Alignment.BOTTOM_RIGHT); 

      panel.setContent(layout); 

      vLayout.addComponent(panel); 
      vLayout.setSizeFull(); 
      vLayout.setComponentAlignment(panel, Alignment.MIDDLE_CENTER); 
      setCompositionRoot(vLayout); 
     } 

     /* (non-Javadoc) 
     * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent) 
     */ 
     @Override 
     public void enter(ViewChangeEvent event) { 
      email.focus(); 
     } 
    } 

Reste classe client:

package com.test.project.restclient; 

import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import org.glassfish.jersey.client.ClientConfig; 
import org.json.simple.JSONObject; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import com.google.gson.Gson; 
import com.test.project.model.User; 


/** 
* Class contain the Rest Client which allow to use and call the rest web services. 
* 
* @author Bob 
*/ 
public class RestClient { 

    private static final String EMAIL_LABEL = "email"; 
    private static final Logger LOG = LoggerFactory.getLogger(RestClient.class); 

    private Client client; 

    public RestClient() { 
     client = ClientBuilder.newClient(new ClientConfig()); 
    } 

    /** 
    * Get the user information from the user email 
    * 
    * @param email 
    * @return user 
    */ 
    @SuppressWarnings("unchecked") 
    @POST 
    @Path("http://IpAddress:8080/api/authentication/") 
    public User getUserInfo(String email) { 
     JSONObject obj = new JSONObject(); 
     obj.put(EMAIL_LABEL, email); 

     WebTarget webtarget = client.target("http://IpAddress:8080/api/authentication/"); 

     Response response = webtarget.request().accept(MediaType.APPLICATION_JSON).post(Entity.entity(obj, MediaType.APPLICATION_JSON)); 

     String answer = response.readEntity(String.class); 
     LOG.info("User information are :" + answer); 
     Gson g = new Gson(); 
     User user = g.fromJson(answer, User.class); 
     return user; 
    } 

} 

Page d'accueil Vue:

package com.test.project.View; 

import com.test.project.model.Action; 
import com.test.project.restclient.RestClient; 
import com.vaadin.data.Binder; 
import com.vaadin.icons.VaadinIcons; 
import com.vaadin.navigator.View; 
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; 
import com.vaadin.server.VaadinSession; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.ComboBox; 
import com.vaadin.ui.CustomComponent; 
import com.vaadin.ui.MenuBar; 
import com.vaadin.ui.TextField; 
import com.vaadin.ui.VerticalLayout; 


/** 
* Home page view. 
* 
* @author Bob 
*/ 
public class HomePageView extends CustomComponent implements 
     View { 

    private static final long serialVersionUID = 1L; 
    public static final String HOMEPAGE = "home"; 

    private final VerticalLayout layout; 

    private static final String TOKEN_ATTRIBUTE_LABEL = "token"; 

    /** 
    * Home page View constructor 
    */ 
    public HomePageView() { 
     layout = new VerticalLayout(); 
     layout.setSizeFull(); 
     String CURRENT_USER_TOKEN = (String) VaadinSession.getCurrent().getAttribute(TOKEN_ATTRIBUTE_LABEL); 
     System.out.println("Current user token : " + CURRENT_USER_TOKEN); 
     createMenu(); 

     setCompositionRoot(layout); 
    } 

    /** 
    * Create a Vertical Menu with the Home page and Actions page 
    */ 
    private void createMenu() { 
     MenuBar barmenu = new MenuBar(); 
     barmenu.addItem("Homepage", VaadinIcons.HOME, null); 
     barmenu.addItem("Actions", VaadinIcons.TABLE, null); 
     layout.addComponent(barmenu); 
    } 


    /* (non-Javadoc) 
    * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent) 
    */ 
    @Override 
    public void enter(ViewChangeEvent event) { 

    } 

} 
+0

Pouvez-vous publier le code complet qui gère l'action de connexion? Peut-être attrapez-vous une exception dans un bloc 'try' et vous le cachez/le laissez tomber? – Morfic

+0

@jay Je n'ai aucune erreur msg ... – Bob

+0

@Morfic, j'ai ajouté la vue de connexion, je vais ajouter le RestClient aussi – Bob

Répondre

1

Ok, j'ai trouvé la solution/workarround pour les questions:

  • Pour la première question: « symbolique » semble être un mot réservé, « tokenEmployee » semble être meilleur et il fonctionne parfaitement. Pour le second numéro: Je ne sais toujours pas pourquoi cela ne fonctionne pas dans Eclipse, j'ai la source mais en mode débogage, je ne suis pas capable de les voir. J'ai changé pour IntelliJ. Je n'ai pas pu trouver quelque chose sur les mots réservés pour la session Vaadin. Si quelqu'un trouve un lien ou quelque chose, je suis très intéressé!

trop de temps à essayer de le réparer ..

Un peu grâce à @jay qui a essayé de me aider!

+0

Content que vous ayez trouvé une solution! – Jay