Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将新的Vaadin Spring启动插件与Vaadin4Spring事件总线一起使用_Spring_Vaadin_Vaadin4spring - Fatal编程技术网

如何将新的Vaadin Spring启动插件与Vaadin4Spring事件总线一起使用

如何将新的Vaadin Spring启动插件与Vaadin4Spring事件总线一起使用,spring,vaadin,vaadin4spring,Spring,Vaadin,Vaadin4spring,Vaadin团队目前发布了一个插件,据我所知,该插件基于非官方的Vaadin4Spring插件: <!-- Vaadin Spring Boot --> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-spring-boot</artifactId> <version>${v

Vaadin团队目前发布了一个插件,据我所知,该插件基于非官方的Vaadin4Spring插件:

    <!-- Vaadin Spring Boot -->
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-spring-boot</artifactId>
        <version>${vaadin.spring.boot.version}</version>
    </dependency>
瓦丁弹簧靴:

Vaadin4Spring:

请注意!截至2015年2月,瓦丁正在进行一项官方调查 Spring附加组件,将是Vaadin4Spring的一小部分。一旦 官方插件发布后,Vaadin4Spring将转换为 提供官方加载项不具备的功能的加载项集 有。您可以在此处查看官方加载项的进度:

然而,VaadinSpring靴子缺少了Vaadin4Spring所具有的一些很酷的特性(如Vaadin4Spring的作者Petter Holmström所述),比如EventBus框架,它非常有用

现在,我已经使用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>
但是视图和UI确实存在!它们由
Vaadin-Spring-Boot
addon管理(以下是一些示例代码):

用户界面:

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

}
其他视图也是如此。当从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>
视图和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容器中注册。怎么办?

我想你可以两者兼得。尝试包括
“org.vaadin.spring:spring vaadin:0.0.5-SNAPSHOT”
,因为
VaadinEventbusConfiguration
依赖于内部类

为什么需要包含
“org.vaadin.spring:spring boot vaadin:0.0.5-SNAPSHOT”
?如果确实需要,请尝试从@EnableAutoConfiguration中排除
org.vaadin.spring.boot.VaadinAutoConfiguration

编辑: 您可以在该分支中使用官方spring4vaadin获取插件:
问题在于,
VaadinSessionScope
尚未在官方的spring4vaadin中实现。你需要创建一个非官方的spring4vaadin

您的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>
应用程序主类

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

作为对公认答案的更新:非官方的vaadin4spring附加组件的模块被重命名。现在必须添加此依赖项:

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

org.vaadin.spring.extensions
瓦丁弹簧外芯
${vaadin4spring.version}

您还可以排除
VaadinEventbusConfiguration
并创建自己的依赖于“com.vaadin:vaadin-spring-boot:${vaadin.spring.boot.version}”内部类的类
@Scope(value=VaadinUIScope.VAADIN\u UI\u Scope\u NAME,proxyMode=ScopedProxyMode.INTERFACES)
我试图包括
spring-VAADIN-0.0.5-SNAPSHOT
而不是
spring-boot-VAADIN
,视图和UI似乎找到了,但
事件总线。*
没有@Autowired,请检查我的编辑(我编辑了答案)我现在才看到:对不起,我不明白。你为什么给我Vaadin4Spring插件的GitHub repos链接?我已经在Maven本地存储库上安装了存储库的
主分支的副本,并且我正在从中选择0.0.5依赖项,我是否必须删除它并使用
功能/official\u spring\u support
分支?是,因为
feature/official\u spring\u support
分支依赖于官方的spring4vaadin,而
master
分支依赖于非官方的spring4vaadin。比较两个分支的
spring-vaadin-eventbus
pom文件,这样你就可以看到我在说什么。在eventbus插件支持官方的spring4vaadin之前,非官方的spring4vaadin依赖关系是暂时的。伙计,你肯定做到了。我想我欠你一个人情!非常感谢。
@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);
    }
}
@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);
    }
}
<dependency>
    <groupId>org.vaadin.spring.extensions</groupId>
    <artifactId>vaadin-spring-ext-core</artifactId>
    <version>${vaadin4spring.version}</version>
</dependency>