2015-11-11 1 views
0

Je n'ai pas de bean qualifiant de type [com.vaadin.ui.HorizontalLayout] trouvé pour une erreur de dépendance lorsque j'essaie d'injecter l'argument d'un autre fichier de configuration comme ceci: Main Config:Aucun bean qualifié de type trouvé pour la dépendance, vaadin

@Configuration 
@EnableVaadin 
@Import(NavigationBar.class) 
@ComponentScan("net.elenx") 
public class SpringConfig { 

    //Create whole view of MainView 
    @Bean 
    VerticalLayout template(@Qualifier("navigationBar") HorizontalLayout navigationBar) { 
     VerticalLayout template = new VerticalLayout(); 
     //NavigationBar navigationBar = new NavigationBar(); 
     Sidebar sidebar = new Sidebar(); 
     template.setMargin(false); 
     template.setSpacing(false); 
     template.setHeight("100%"); 
     template.addComponent(navigationBar); 
     template.addComponent(sidebar.getSidebar()); 
     template.setExpandRatio(sidebar.getSidebar(), 1.0f); 
     return template; 
    } 
} 

config Deuxième:

@Configuration 
@EnableVaadin 
public class NavigationBar { 

    @Bean 
    HorizontalLayout navigationBar(Button hamburgerButton, Label elenxLogo) { 
     System.out.println("Hello from NavigationBar bean!"); 
     HorizontalLayout navbar = new HorizontalLayout(); 
     navbar.setWidth("100%"); 
     navbar.setMargin(true); 
     navbar.setHeight(50, Sizeable.Unit.PIXELS); 
     navbar.addComponent(hamburgerButton); 
     navbar.addComponent(elenxLogo); 
     navbar.addStyleName("navigation-bar"); 
     return navbar; 
    } 

    @Bean 
    Button hamburgerButton() { 
     Button hamburgerButton = new Button(); 
     hamburgerButton.addStyleName("hamburger-button"); 
     hamburgerButton.setIcon(VaadinIcons.MENU); 
     return hamburgerButton; 
    } 

    @Bean 
    Label elenxLogo() { 
     Label logo = new Label("ElenX"); 
     logo.addStyleName("elenx-logo"); 
     logo.setWidthUndefined(); 
     logo.setEnabled(false); 
     return logo; 
    } 
} 

Alors, quelle est la façon Corrent de réaliser cette injection? Je veux avoir des beans pour chaque élément et juste les injecter pour construire une mise en page entière. Quand j'ai essayé de changer cette ligne:

@Bean 
VerticalLayout template(HorizontalLayout navigationBar) { 

à ceci:

@Bean 
VerticalLayout template(@Qualifier("navigationBar") HorizontalLayout navigationBar) { 

je suis arrivé "Impossible de haricot doit lier automatiquement Qualifier de type 'composant'." Erreur. Je suis frais au printemps et je ne suis pas sûr de ce que j'ai mal fait, ne devrait pas correspondre à ma méthode de navigation HorizontalLayout avec le paramètre du modèle VerticalLayout (HorizontalLayout navigationBar)?

Répondre

1

Le message d'erreur que vous obtenez vous indique que le grain de qualification (ce qui est le HorizontalLayout annotée avec @Qualifier("navigationBar")) doit être un ressort @component, qui est le HorizontalLayout a besoin d'être annotés avec @Component ce qui est évidemment impossible.

Un autre problème que vous rencontrez avec votre approche est que les beans Spring sont des singletons par défaut. Vous obtiendrez ainsi exactement une instance de la disposition navigationBar dans votre application. Cela n'est bien sûr pas suffisant car vous avez besoin d'une nouvelle instance pour chaque nouvel objet d'interface utilisateur créé pour un utilisateur. Le bean Spring navigationBar doit avoir prototype scope pour qu'une nouvelle instance soit créée par le contexte de l'application à chaque événement d'injection. Ceci mis à part, je vous conseille fortement de ne pas utiliser les composants Vaadin UI individuels pour l'autowiring. Le mécanisme d'injection de dépendance de Spring n'est pas destiné à être utilisé à ce niveau. Vous devriez plutôt utiliser des composants plus grossiers comme des beans Spring, tels que Vaadin views ou des services backend complets. La création de composants d'interface utilisateur individuels (comme une barre de navigation, des formulaires ou des vues) doit être effectuée sans injection de dépendance. L'utilisation de DI est excessive parce que vous pouvez créer des instances pour les composants d'interface utilisateur courants tels qu'une barre de navigation, un bouton hamburger ou un logo Elenx simplement en appelant leur constructeur. Il n'y a pas besoin d'autowiring dans les composants de l'interface utilisateur, ce qui rend l'utilisation du conteneur Spring complètement redondante dans ce cas. Le meilleur moyen de modulariser le code Vaadin au niveau des composants est d'utiliser la classe CustomComponent comme classe de base pour les nouveaux composants. Vous devez créer une nouvelle sous-classe de CustomComponent nommée NavigationBar que vous pouvez ensuite instancier et ajouter à une disposition comme n'importe quel autre composant Vaadin.

+0

ok Je vois, alors quelle est la meilleure façon d'écrire des modules d'interface utilisateur comme les barres latérales, navbars dans Vaadin? Je me soucie du meilleur code possible, merci pour votre réponse! – Zeezl

+0

De rien, j'ai édité ma réponse en conséquence. –