2

Vaadin チームは現在、非公式の Vaadin4Spring アドオンに基づいて理解しているアドオンをリリースしています。

Vaadin スプリング ブート: https://vaadin.com/directory#addon/vaadin-spring-boot

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

ご注意ください!2015 年 2 月現在、Vaadin は、Vaadin4Spring の小さなサブセットとなる公式の Spring アドオンに取り組んでいます。公式アドオンがリリースされると、Vaadin4Spring は、公式アドオンにない機能を提供する一連のアドオンに変換されます。公式アドオンの進行状況は、 https ://github.com/vaadin/spring で確認できます。

ただし、Vaadin Spring Boot には、非常に便利な EventBus フレームワークなど、Vaadin4Spring が備えているいくつかの優れた機能 (Vaadin4Spring の作成者である Petter Holmström が前述したように) がありません。

これで、Vaadin Spring Boot アドオンと Vaadin4Spring アドオンの両方を使用して Maven プロジェクトをセットアップしました。

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

基本的には、両方のフレームワークの機能を使いたい(というかVaadin Spring Boot、メインのフレームワークにして、そのVaadin4Spring EventBus機能を併用したい)。しかし、私が気付いた問題は、両方のフレームワークがまだ共存できないように見えることです。

上記のように両方のアドオンを追加すると、アプリケーションを実行すると、ビューも UI も見つかりません (意味を示すログの下):

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

しかし、ビューと UI は存在します。それらはVaadin Spring Bootアドオンによって管理されます (ここにいくつかのサンプル コードがあります)。

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

}

@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"));
    }

}

他のビューについても同様です。これら 2 つの依存関係が 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>

EventBus フレームワークの使用を許可していません。誰かがすでに新しいアドオンを調べていて、同じ必要がありましたか? 2 つの世界を統合する方法を見つけましたか? Vaadin Spring Bootそれとも、Vaadin4Spring ツールを Vaadin Spring Boot に使用するのはまだ早いので、投稿した最初のブロックで述べたように、Vaadin4Spring 機能が一連のアドオンに変換されるのを待つ必要がありますか?

編集:3つの依存関係を一緒にしながら、Spring Bootアプリケーションクラスに注釈を追加しようとしました@ComponentScanが、役に立ちませんでした...

spring-vaadin代わりに追加すると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>

ビューと UI が読み込まれ、ブラウザーに表示されますが、イベント バスの使用を開始しようとすると、次の例外が発生します。

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

EventBus.* Bean が Spring IoC コンテナー内に登録されていないようです。何をすべきか?

4

3 に答える 3

1

両方いただけると思います。内部クラスに依存している"org.vaadin.spring:spring-vaadin:0.0.5-SNAPSHOT"ため、含めるようにしてください。VaadinEventbusConfiguration

を含める必要があるのはなぜ"org.vaadin.spring:spring-boot-vaadin:0.0.5-SNAPSHOT"ですか? 本当に必要な場合はorg.vaadin.spring.boot.VaadinAutoConfiguration、@EnableAutoConfiguration から除外してみてください。

編集: このブランチの公式 spring4vaadin でアドオンを取得できます: https://github.com/peholmst/vaadin4spring/tree/feature/official_spring_support

于 2015-03-01T22:47:55.923 に答える
0

受け入れられた回答の更新として: 非公式の vaadin4spring アドオンのモジュールの名前が変更されました。次に、この依存関係を追加する必要があります。

<dependency>
    <groupId>org.vaadin.spring.extensions</groupId>
    <artifactId>vaadin-spring-ext-core</artifactId>
    <version>${vaadin4spring.version}</version>
</dependency>
于 2016-12-01T07:16:03.290 に答える