1
votes

Le composant Vaadin LoginForm est vide

J'ai du code pour ajouter le composant Vaadin LoginForm à ma page

LoginForm component = new LoginForm();
component.addLoginListener(e -> {
       boolean isAuthenticated = myAuthMethod();
       if (isAuthenticated) {
            System.out.println("TEST");
        } else {
            component.setError(true);
        }
    });

 add(component);

Mais il montre juste une page vierge. Mon éditeur dom dans Chrome affiche une balise vide ...

J'utilise Vaadin 14.07

 entrez la description de l'image ici

Des idées pourquoi cela pourrait être?


1 commentaires

Cela fonctionne bien localement pour moi ... Avez-vous des erreurs dans la console? Et pourriez-vous poster une vue complète? Ou comment l'ajoutez-vous à une vue?


3 Réponses :


0
votes

J'ai également eu ce problème. Cela pourrait être une autre raison. Cependant, je pourrais le résoudre en exécutant un nettoyage et une installation de Maven.


1 commentaires

Bien que le nettoyage soit parfois le seul moyen de sortir avec des outils de construction merdiques, je ne suis pas un grand fan du culte du fret "avez-vous essayé de l'éteindre et de le rallumer". Aviez-vous essayé, si une seule des tâches de construction / préparation du frontend du plugin vaadin14 maven le corrigeait tout seul?



0
votes

Lors de l'ajout d'un composant pour la première fois, la liste des dépendances internes du frontend peut ne pas avoir encore enregistré ce composant et donc ne pas charger les fichiers côté client associés à partir de npm au démarrage.

Dans ce cas, une simple installation maven est nécessaire pour mettre à jour la liste des dépendances frontales. Après cela, le serveur devrait charger automatiquement les fichiers respectifs et ainsi afficher correctement le composant.


1 commentaires

Si cela ne résout pas le problème, cela peut également être ce problème ( problème lié à github ). Se produit uniquement lorsqu'aucun composant @Route n'utilise / importe directement le composant en question.



0
votes

Le LoginForm fonctionne pour moi. Votre problème est peut-être en dehors du code que vous avez montré ici. Nous aurions besoin de savoir comment vous avez instancié et affiché le LoginForm .

Exemple d'application

Voici un exemple d'application utilisant Vaadin 14.1.2. J'ai utilisé un nouveau projet de saveur "Plain Java Servlet" généré par la page de démarrage Vaadin . J'ai laissé le fichier POM intact. J'ai exécuté l'application en utilisant le serveur Jetty fourni et j'ai utilisé la version 79.0.3945.79 de Google Chrome (version officielle) (64 bits) pour macOS.

J'ai créé une classe User simple .

package work.basil.example;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.login.AbstractLogin;
import com.vaadin.flow.component.login.LoginForm;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.PWA;
import com.vaadin.flow.server.VaadinSession;

import java.util.Objects;
import java.util.Optional;

/**
 * The main view contains a button and a click listener.
 */
@Route ( "" )
@PWA ( name = "Project Base for Vaadin", shortName = "Project Base" )
public class MainView extends VerticalLayout
{

    public MainView ( )
    {
        this.display();
    }

    private void display ( )
    {
        if ( Objects.isNull( VaadinSession.getCurrent().getAttribute( User.class ) ) )
        {
            this.removeAll();
            this.add( this.makeLoginForm() );
        } else
        { // Else we have a User, so must be authenticated.
            this.removeAll();
            this.add( new ContentView() );
        }
    }

    private LoginForm makeLoginForm ( )
    {
        Authenticator authenticator = new Authenticator();
        LoginForm component = new LoginForm();
        component.addLoginListener( ( AbstractLogin.LoginEvent loginEvent ) -> {
            Optional < User > user = authenticator.authenticate( loginEvent.getUsername() , loginEvent.getPassword() );
            if ( user.isPresent() )
            {
                VaadinSession.getCurrent().setAttribute( User.class , user.get() );
                this.display();
            } else
            {
                component.setError( true );
            }
        } );
        return component;
    }
}

Et une classe Authenticator . Comment-out ou dans les lignes pour toujours passer l'utilisateur ou toujours refuser l'utilisateur, pour ce cas de démonstration simple.

package work.basil.example;

import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;

public class ContentView extends VerticalLayout
{
    public ContentView ( )
    {
        this.add( new H1( "Content goes here" ) );
    }
}

Une vue de contenu factice à afficher après que l'utilisateur a réussi authentifié.

package work.basil.example;

import java.util.Optional;
import java.util.UUID;

public class Authenticator
{
    Optional < User > authenticate ( String username , String password )
    {
        User user = new User( UUID.fromString( "76317e14-20a5-11ea-978f-2e728ce88125" ) , username );
        return Optional.of( user );
        //        return Optional.empty();
    }
}

Rassemblez le tout avec cette mise en page MainView .

package work.basil.example;

import java.util.Objects;
import java.util.UUID;

public class User
{
    private UUID id;
    private String username;

    public User ( UUID id , String username )
    {
        this.id = Objects.requireNonNull( id );
        this.username = Objects.requireNonNull( username );
    }

    // ------------|  Object  |---------------------------------
    @Override
    public boolean equals ( Object o )
    {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        User user = ( User ) o;
        return id.equals( user.id );
    }

    @Override
    public int hashCode ( )
    {
        return Objects.hash( id );
    }

    @Override
    public String toString ( )
    {
        return "User{ " +
                "id=" + id +
                " | username='" + username + '\'' +
                " }";
    }
}

Pour un "déconnexion", votre code n'a besoin que de supprimer l'objet User de la session et d'appeler à nouveau MainView :: display .


0 commentaires