2017-09-21 1 views
0

ich ein sehr seltsames Verhalten haben, ich glaube, ich zwei Fragen haben, ich setze sie zusammen auf der gleichen Post, weil sie verknüpft werden können:Kann nicht mit dem Vaadin Navigator umleiten

mein Code:

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

1. Erste Ausgabe

ich auf der Login-Seite bin, kann ich meine Benutzerinformationen sehen, aber ich kann auf die Homepage nicht navigieren. Ich habe keinen Fehler!

Wenn ich die Zeile mit dem vaadinSession löschen, wird der Navigator arbeiten ...

2. Zweite Ausgabe

Ich habe versucht, meinen Code zu debuggen, aber ich erhielt eine „Quelle nicht gefunden“, um das zu beheben, folge ich Eclipse java debugging: source not found. Aber, scheint für mich zu arbeiten. Was ich getan habe:

  • Ich erstellte einen neuen Arbeitsbereich ohne Erfolg.
  • ich die Quellensuche Pfad bearbeitet und ich darin mein Java-Projekt habe
  • In den Einstellungen -> Java -> installiert JREs -> Ich habe die 1.8.0 JDK
  • direkt am Projekt klicken -> maven -> Download-Quellen
  • direkt am Projekt klicken -> maven -> maven Natur deaktivieren und nach Configure -> Projekt

EDIT maven: Lösung für das Problem 2: ich so blockiert ... Ich weiß, es ist ein Problem mit der Sonnenfinsternis (Konfiguration oder so etwas) so wie das). Ich habe mich für IntelliJ geändert. Diese IDE zeigt mir Quellen ohne Probleme.

INFO

I Vaadin und REST Web Services (mit javax.ws.rs.client.ClientBuilder) bin mit. Wenn ich SYSOUT verwende, habe ich die guten Informationen. Ich habe die Informationen von der Homepage erhalten (anstelle der Ansicht scheint die Login-Ansicht zu bleiben).

Jeder Hinweis wird sehr nützlich sein!


EDIT: Vollloginview Klasse

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

Ruhe Client-Klasse:

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; 
    } 

} 

Homepage ansehen:

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

Können Sie den vollständigen Code veröffentlichen, der die Login-Aktion behandelt? Vielleicht fangen Sie eine Ausnahme in einem 'try' Block und verstecken/löschen es? – Morfic

+0

@jay Ich habe keinen Fehler msg ... – Bob

+0

@Morfic, ich habe die Login-Ansicht hinzugefügt, ich werde auch den RestClient hinzufügen – Bob

Antwort

1

Ok, ich die Lösung/workarround für die Probleme gefunden:

  • Für die erste Ausgabe: „Token“ scheint ein reserviertes Wort zu sein „tokenEmployee“ scheint besser zu sein und es ist perfekt funktioniert. ..

  • Für das zweite Problem: Ich weiß immer noch nicht, warum es nicht funktioniert in Eclipse, ich habe die Quelle, aber im Debug-Modus, ich bin nicht in der Lage, sie zu sehen. Ich habe mich für IntelliJ geändert. Ich konnte nichts über reservierte Wörter für die Vaadin-Sitzung finden. Wenn jemand einen Link oder etwas findet, bin ich sehr interessiert!

Zu viel Zeit mit dem Versuch, es zu beheben ..

Ein bisschen dank @jay, der mich versucht zu helfen!

+0

Froh, dass Sie eine Lösung gefunden haben! – Jay

Verwandte Themen