2015-03-01 1 views
2

L'équipe de Vaadin a actuellement publié un addon qui est comme je l'ai compris sur la base addon Vaadin4Spring non officielle:Comment utiliser la nouvelle addon Vaadin Spring Boot avec Vaadin4Spring EventBus

Vaadin Spring Boot: https://vaadin.com/directory#addon/vaadin-spring-boot

Vaadin4Spring: https://github.com/peholmst/vaadin4spring

S'il vous plaît noter! En février 2015, Vaadin travaille sur un complément officiel de qui sera un petit sous-ensemble de Vaadin4Spring. Une fois le module complémentaire officiel publié, Vaadin4Spring sera converti en un ensemble d'add-ons offrant des fonctionnalités que l'extension officielle n'a pas. Vous pouvez suivre la progression de l'add-on officiel ici: https://github.com/vaadin/spring

Cependant, le démarrage du printemps Vaadin manque quelques fonctionnalités intéressantes qui Vaadin4Spring a (comme dit plus haut par Petter Holmström, l'auteur de Vaadin4Spring), comme le framework EventBus, qui est vraiment utile.

Maintenant, j'ai mis en place un projet Maven à la fois avec l'addon Spring Vaadin Boot et l'addon Vaadin4Spring:

<!-- Vaadin Spring Boot --> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-spring-boot</artifactId> 
     <version>${vaadin.spring.boot.version}</version> 
    </dependency> 

Fondamentalement, je voudrais utiliser les caractéristiques des deux cadres (ou mieux, je le ferais aimer utiliser Vaadin Spring Boot comme cadre principal et utiliser les fonctionnalités Vaadin4Spring EventBus avec lui). Le problème que j'ai remarqué, cependant, c'est qu'il semble que les deux cadres ne peuvent pas encore coexister les uns avec les autres.

Si je COMBINEZ addons comme ci-dessus, quand je lance l'application, aucune vue et aucune UIs se trouvent (en dessous du journal indiquant ce que je veux dire):

2015-03-01 22:07:22.001... SpringViewProvider: Looking up VaadinViews 
2015-03-01 22:07:22.006 WARN SpringViewProvider: No VaadinViews found ... 
... 
2015-03-01 22:12:12.584 INFO: Checking the application context for Vaadin UIs 
2015-03-01 22:12:12.594 WARN: Found no Vaadin UIs in the application context 

Mais les vues et l'interface utilisateur ne exister! Ils sont gérés par le addon Vaadin Spring Boot (est un exemple de code ici):

UI:

@SpringUI("") 
@Theme("valo") 
public class DemoUI extends UI { 

    private static final long serialVersionUID = 193481619798227053L; 

    @Autowired 
    private Greeter greeter; 

    @Autowired 
    private ApplicationContext applicationContext; 

    private final SpringViewProvider viewProvider; 

    private VerticalLayout layout; 

    @Autowired 
    public DemoUI(SpringViewProvider viewProvider) { 
     this.viewProvider = viewProvider; 
    } 

    @Override 
    protected void init(VaadinRequest request) {   
     layout = new VerticalLayout(); 
     layout.setMargin(true); 
     layout.setSpacing(true); 
     setContent(layout); 

     Label greetings = new Label(greeter.getGreeting()); 
     layout.addComponent(greetings); 

     final CssLayout navigationBar = new CssLayout(); 
     navigationBar.addStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); 
     navigationBar.addComponent(createNavigationButton("View Scoped View", ViewScopedView.VIEW_NAME)); 
     navigationBar.addComponent(createNavigationButton("UI Scoped View", UIScopedView.VIEW_NAME)); 
     navigationBar.addComponent(createNavigationButton("Another UI Scoped View", AnotherUIScopedView.VIEW_NAME)); 
     layout.addComponent(navigationBar);  

     final Panel viewContainer = new Panel(); 
     viewContainer.setSizeFull(); 
     layout.addComponent(viewContainer); 
     layout.setExpandRatio(viewContainer, 1.0f); 

     Navigator navigator = new Navigator(this, viewContainer); 
     navigator.addProvider(viewProvider); 



    } 

    private Button createNavigationButton(String caption, String viewName) { 
     Button button = new Button(caption); 
     button.addStyleName(ValoTheme.BUTTON_SMALL); 
     button.addClickListener(event -> { 
      try { 
       getUI().getNavigator().navigateTo(viewName); 
      } 
      catch (IllegalArgumentException e) { 
       // view with the given name is not mapped 
       System.out.println("Not mapped view with name: " + viewName); 
      } 
     }); 
     return button; 
    } 

} 

Une vue annotée avec @SpringView:

@SpringView(DefaultView.VIEW_NAME) 
public class DefaultView extends VerticalLayout implements View { 

    private static final long serialVersionUID = -2052937117362922764L; 

    public static final String VIEW_NAME = ""; 

    @Override 
    public void enter(ViewChangeEvent event) { 
     // the view is constructed in the init() method()  
    } 

    @PostConstruct 
    void init() { 
     addComponent(new Label("This is the default view")); 
    } 

} 

va de même pour d'autres vues. Et tout fonctionne, lorsque ces deux dépendances sont retirées de la pom.xml:

<!-- Vaadin4Spring addon, the EventBus framework needs this addon --> 
    <dependency> 
     <groupId>org.vaadin.spring</groupId> 
     <artifactId>spring-boot-vaadin</artifactId> 
     <version>0.0.5-SNAPSHOT</version> 
    </dependency> 
    <!-- Vaadin4Spring EventBus feature I would like to use with Vaadin Spring Boot --> 
    <dependency> 
     <groupId>org.vaadin.spring</groupId> 
     <artifactId>spring-vaadin-eventbus</artifactId> 
     <version>0.0.5-SNAPSHOT</version> 
    </dependency> 

ne me permettant pas d'utiliser le cadre de EventBus. Quelqu'un a-t-il déjà exploré le nouvel addon et a-t-il eu le même besoin? Avez-vous découvert comment intégrer les deux mondes? Ou est-il encore trop tôt pour utiliser les outils Vaadin4Spring dans Vaadin Spring Boot et nous devrions attendre que les fonctionnalités Vaadin4Spring soient converties en un ensemble d'addons qui complétera Vaadin Spring Boot comme dit dans le premier bloc que j'ai posté?

EDIT: J'ai également essayé d'ajouter une annotation @ComponentScan à la classe d'application Spring Boot tout en ayant les trois dépendances ensemble, n'a pas aidé ...

Si j'ajoute spring-vaadin au lieu de spring-boot-vaadin:

 <!-- Vaadin4Spring --> 
     <dependency> 
      <groupId>org.vaadin.spring</groupId> 
      <artifactId>spring-vaadin</artifactId> 
      <version>${vaadin4spring.version}</version> 
     </dependency> 
     <!-- Vaadin4Spring EventBus framework --> 
     <dependency> 
      <groupId>org.vaadin.spring</groupId> 
      <artifactId>spring-vaadin-eventbus</artifactId> 
      <version>${vaadin4spring.version}</version> 
     </dependency> 

Vues et UIs sont chargés et je peux les voir dans le navigateur, mais dès que je veux commencer à utiliser un bus d'événements, je reçois le texte suivant exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vaadinSpringBootDemoApplication': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.vaadin.spring.events.EventBus$ApplicationEventBus demo.VaadinSpringBootDemoApplication.applicationEventBus; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.vaadin.spring.events.EventBus$ApplicationEventBus] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) 
    at demo.VaadinSpringBootDemoApplication.main(VaadinSpringBootDemoApplication.java:21) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.vaadin.spring.events.EventBus$ApplicationEventBus demo.VaadinSpringBootDemoApplication.applicationEventBus; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.vaadin.spring.events.EventBus$ApplicationEventBus] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 16 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.vaadin.spring.events.EventBus$ApplicationEventBus] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    ... 18 common frames omitted 

Il semble que les EventBus * les haricots ne soient enregistrés pas à l'intérieur du conteneur Spring IoC.. Que faire?

Répondre

2

Le problème est que VaadinSessionScope n'est pas encore implémentée dans spring4vaadin officiel. Vous devez créer cette pensée bean le spring4vaadin non officiel.

Votre fichier pom:

<!-- Official Vaadin4Spring --> 
<dependency> 
    <groupId>com.vaadin</groupId> 
    <artifactId>vaadin-spring</artifactId> 
    <version>${vaadin.spring.version}</version> 
</dependency> 
    <dependency> 
    <groupId>com.vaadin</groupId> 
    <artifactId>vaadin-spring-boot</artifactId> 
    <version>${vaadin.spring.boot.version}</version> 
</dependency> 
<!-- Unofficial Vaadin4Spring --> 
<dependency> 
    <groupId>org.vaadin.spring</groupId> 
    <artifactId>spring-vaadin</artifactId> 
    <version>${vaadin4spring.version}</version> 
</dependency> 
<!-- Vaadin4Spring EventBus Addon --> 
<dependency> 
    <groupId>org.vaadin.spring</groupId> 
    <artifactId>spring-vaadin-eventbus</artifactId> 
    <version>${vaadin4spring.version}</version> 
</dependency> 

exemple de l'interface utilisateur:

@SpringUI("/ui") 
@Title("Test") 
@Theme("valo") 
public class MainUI extends UI { 

    private final Logger log = LoggerFactory.getLogger(MainUI.class); 

    @Inject 
    EventBus.UIEventBus eventBus; 

    @Override 
    protected void init(VaadinRequest request) { 
     eventBus.subscribe(this); 

     setContent(new Button("Create event", (e) -> { 
      eventBus.publish(EventScope.UI, "Payload string."); 
     })); 
    } 

    @EventBusListenerMethod 
    public void onEvent(String str) { 
     log.debug("Event received: {}", str); 
    } 
} 

application principale classe

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
@EnableVaadinEventBus 
public class Application { 

    private static final Logger log = LoggerFactory.getLogger(Application.class); 

    @Bean 
    static VaadinSessionScope vaadinSessionScope() { 
     return new VaadinSessionScope(); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
+0

La dépendance non officielle de spring4vaadin est temporaire jusqu'à ce que l'addon eventbus prenne en charge le spring4vaadin officiel. –

+0

Man, vous avez définitivement fait cela. Je suppose que je te dois une faveur! Je vous remercie! – tonix

1

Je pense que vous pouvez avoir les deux. Essayez d'inclure "org.vaadin.spring:spring-vaadin:0.0.5-SNAPSHOT" puisque VaadinEventbusConfiguration repose sur des classes internes. Pourquoi devez-vous inclure "org.vaadin.spring:spring-boot-vaadin:0.0.5-SNAPSHOT"? Si vous en avez vraiment besoin, essayez d'exclure org.vaadin.spring.boot.VaadinAutoConfiguration de @EnableAutoConfiguration.

EDIT: Vous pouvez obtenir addons avec le spring4vaadin officiel dans cette branche: https://github.com/peholmst/vaadin4spring/tree/feature/official_spring_support

+0

Vous pouvez également exclure 'VaadinEventbusConfiguration' et créez votre propre qui repose sur "com.vaadin: Vaadin-printemps-boot: $ {} vaadin.spring.boot.version" classes internes. '@Scope (valeur = VaadinUIScope.VAADIN_UI_SCOPE_NAME, proxyMode = ScopedProxyMode.INTERFACES)' –

+0

J'ai essayé d'inclure 'spring-vaadin-0.0.5-SNAPSHOT' au lieu de' spring-boot-vaadin', les vues et les interfaces utilisateur semblent être trouvé, mais le 'EventBus. *' ne pas obtenir @Autowired, s'il vous plaît, vérifiez mon edit – tonix

+0

(j'ai édité ma réponse) Je viens de voir cela maintenant: https://github.com/peholmst/vaadin4spring/tree/ feature/official_spring_support –

0

Comme une mise à jour de la réponse acceptée: les modules du vaadin4spring officieux ajouter -on ont été renommés. Maintenant, il faut ajouter cette dépendance:

<dependency> 
    <groupId>org.vaadin.spring.extensions</groupId> 
    <artifactId>vaadin-spring-ext-core</artifactId> 
    <version>${vaadin4spring.version}</version> 
</dependency>