如何将新的Vaadin Spring启动插件与Vaadin4Spring事件总线一起使用
Vaadin团队目前发布了一个插件,据我所知,该插件基于非官方的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 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>