2016-03-22 5 views
1

Ich bin relativ neu in vaadin und begann mit einer Spring-Boot-Anwendung und dem Vaadin Spring Boot-Plugin. Alles hat gut funktioniert, bis ich an den Punkt kam, an dem ich versuchte, meine eigenen Komponenten/Widgets zu erstellen.Vaadin Custom Komponenten/Widgets mit Maven und Spring Boot

Leider habe ich kein "offizielles" Beispiel/Dokumentation gefunden, wie man benutzerdefinierte Komponenten in einer Spring Boot-Anwendung einrichten kann, also musste ich im Internet suchen, um herauszufinden, wie man zusätzliche Plugins in maven einrichtet kompilieren Sie den Code für die clientseitigen Widgets. Soweit ich die Zusammenstellung dieser Komponenten Arbeiten erzählen von der Protokollausgabe kann, aber wenn ich versuche, auf der Webseite diese Komponenten zugreifen bekomme ich einen Fehler:

Widgetset 'com.vaadin.DefaultWidgetSet' does not contain implementation for net.gtidev.test.components.MyComponent. Check its component connector's @Connect mapping, widgetsets GWT module description file and re-compile your widgetset. [...] 

Hier ist das Widget Compiler log:

[INFO] Using com.vaadin:vaadin-client-compiler version 7.6.4 
[ERROR] Mar 22, 2016 10:22:43 AM java.util.prefs.WindowsPreferences <init> 
[ERROR] WARNUNG: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 
[INFO] Compiling module net.gtidev.test.components.TestWidgetset 
[INFO] Computing all possible rebind results for 'com.vaadin.client.metadata.ConnectorBundleLoader' 
[INFO]  Rebinding com.vaadin.client.metadata.ConnectorBundleLoader 
[INFO]   Invoking generator com.vaadin.server.widgetsetutils.ConnectorBundleLoaderFactory 
[INFO]    Populating eager bundle 

. . . . . 250 more lines 

[INFO] Computing all possible rebind results for 'com.vaadin.client.ui.dd.VAcceptCriterionFactory' 
[INFO]  Rebinding com.vaadin.client.ui.dd.VAcceptCriterionFactory 
[INFO]   Invoking generator com.vaadin.server.widgetsetutils.AcceptCriteriaFactoryGenerator 
[INFO]    Detecting available criteria ... 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.AcceptAll 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.And 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.ContainsDataFlavor 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.SourceIs 
[INFO]    creating mapping for com.vaadin.ui.AbstractSelect.TargetItemIs 
[INFO]    creating mapping for com.vaadin.ui.AbstractSelect.AcceptItem 
[INFO]    creating mapping for com.vaadin.ui.Table.TableDropCriterion 
[INFO]    creating mapping for com.vaadin.ui.Tree.TreeDropCriterion 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.Not 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.Or 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.ServerSideCriterion 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.SourceIsTarget 
[INFO]    creating mapping for com.vaadin.event.dd.acceptcriteria.TargetDetailIs 
[INFO]    creating mapping for com.vaadin.ui.Tree.TargetInSubtree 
[INFO]    Done. (0seconds) 
[INFO] Compiling 1 permutation 
[INFO]  Compiling permutation 0... 
[INFO] Compile of permutations succeeded 
[INFO] Compilation succeeded -- 59,217s 
[INFO] Linking into C:\projects\misc\vaadin-boot\target\vaadin-boot-0.0.1-SNAPSHOT\net.gtidev.test.components.TestWidgetset 
[INFO] Link succeeded 
[INFO] Linking succeeded -- 0,492s 

Die Dateien, die ich für meine benutzerdefinierte Komponente verwende, wurden vom Eclipse vaadin Addon in einem vaadin 7 Projekt generiert, das ich nur für diesen Zweck erstellt habe. Als ich dieses vaadin 7-Projekt in Eclipse gestartet habe, hat die Komponente funktioniert. Ich habe dann diese Dateien in mein Spring-Boot-Maven-Projekt kopiert, wo die benutzerdefinierte Komponente nicht mehr geladen wird.

Ich weiß, dass Springboot-Anwendungen einen etwas anderen Bootstrap-Mechanismus und Layout als "klassische" Webapps haben und dass unter anderem statische Ressourcen nicht aus dem webapp-Ordner, sondern aus dem Classpath:/static Ordner geladen werden. Ich denke, dass der Kern des Problems etwas mit dieser Tatsache zu tun hat, aber ich weiß nicht, was ich tun soll, um es zu beheben.

Meine Plugin-Konfiguration (Ich habe versucht, mit und ohne die kommentierten Optionen):

<plugin> 
    <groupId>com.vaadin</groupId> 
    <artifactId>vaadin-maven-plugin</artifactId> 
    <version>7.6.4</version> 
    <configuration> 
    <strict>true</strict> 
    <force>true</force> 
    <!-- Enable during development to speed compiling. --> 
    <!-- <draftCompile>true</draftCompile> 
    <style>DETAILED</style> --> 
    <!-- End development options --> 
    <!--<webappDirectory>src/main/webapp/VAADIN/widgetsets</webappDirectory>--> 
    <modules> 
     <module>net.gtidev.test.components.TestWidgetset</module> 
    </modules> 
    </configuration> 
    <executions> 
    <execution> 
     <goals> 
     <goal>resources</goal> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Ich habe versucht, verschiedene Maven Kombinationen und Konfigurationen Plugin. In einem Beispiel gibt es auch eine Google-GWT-Plugin erwähnt, aber auf dem Code dieses Plugin läuft erzeugte die gleiche Protokollausgabe als Vaadin Plugin:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>gwt-maven-plugin</artifactId> 
    <version>2.5.1</version> 
    <!--<configuration>--> 
    <!--<webappDirectory>src/main/webapp/VAADIN/widgetsets</webappDirectory>--> 
    <!--<extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>--> 
    <!--<runTarget>clean</runTarget>--> 
    <!--<hostedWebapp>${project.build.directory}/${project.build.finalName}</hostedWebapp>--> 
    <!--<noServer>true</noServer>--> 
    <!--<port>8080</port>--> 
    <!--<soycDetailed>false</soycDetailed>--> 
    <!--</configuration>--> 
    <executions> 
    <execution> 
     <goals> 
     <goal>resources</goal> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
+0

Verwenden Sie nicht gwt-Maven-Plugin mit Vaadin 7, gwt-Maven-Plugin wurde in Vaadin 6-Serie verwendet. Ich denke, dass dein ursprünglicher Versuch fast richtig war, nur Boot schaut nicht in src/main/webapp, also muss das konfiguriert werden. Siehe meine Antwort unten. – mstahv

Antwort

2

Um benutzerdefinierte Client-Erweiterungen zu verwenden, Add-ons Vaadin, Sie müssen vaadin-maven-plugin zu Ihrem Projekt hinzufügen. Es wird die von Ihnen verwendeten Add-Ons scannen und GWT kompiliert ein neues Widgetset für Ihr Projekt, das diese Erweiterungen enthält.

Wenn Sie das Projekt mit start.spring.io erstellt haben, befindet sich das Maven-Plugin standardmäßig nicht in Ihrem Projekt. Erstellen Sie ein Beispielprojekt zum Beispiel unter Verwendung dieses Vaadin+Spring archetype oder des offiziellen Servlet-basierten Archetyps und kopieren Sie die mit vaadin-maven-plugin verbundenen Teile aus der pom.xml in Ihre Projekte pom.xml. Dann machen Sie einen vollständigen Build und alles sollte wie erwartet funktionieren.

+0

vielen dank! "Diese Veränderung" half mir, das Problem zu lösen. Ich musste noch einige Einstellungen machen und ich musste @Widgetset ("MyWidgetset") zu meinem Haupt-UI hinzufügen, jetzt funktioniert es! – gofrm

+0

Warum hast du nicht geschrieben, dass du die '@Widgetset-Annotation (" MyWidgetset ") verwenden musst? – Alex78191

+0

Die Antwort war etwas veraltet, nur für 2018 aktualisiert. – mstahv