将vaadin@UIScope bean注入spring@组件
我正在使用Vaadin Spring 1.0.0,并试图找出如何将仅在UI范围内可用的bean(当用户打开页面时)注入到经典的Spring将vaadin@UIScope bean注入spring@组件,spring,vaadin,vaadin7,vaadin-spring-boot,Spring,Vaadin,Vaadin7,Vaadin Spring Boot,我正在使用Vaadin Spring 1.0.0,并试图找出如何将仅在UI范围内可用的bean(当用户打开页面时)注入到经典的Spring@Componentbean中。简单,让我们来上课: @Component public class A { @Inject private IB b; } @UIScope @SpringComponent public class B implements IB { } 很明显,在启动过程中: Caused by: java.lang
@Component
bean中。简单,让我们来上课:
@Component
public class A {
@Inject
private IB b;
}
@UIScope
@SpringComponent
public class B implements IB {
}
很明显,在启动过程中:
Caused by: java.lang.IllegalStateException: No VaadinSession bound to current thread
通常的做法是什么?我理解整个概念,当UI作用域不可用时,bean在启动时初始化,但我使用在Spring中用
@Component
实现的公共库,我想实现一些接口,但我只能在UI范围内执行,而不能在启动期间执行。您需要从ApplicationContext
本身获取它:
@Component
public class A {
@Autowired
private ApplicationContext context;
public B getCurrentB(){
return context.getBean(B.class);
}
}
请注意,如果没有绑定到当前线程的UI(正常情况下),它将抛出异常。换句话说,您必须确保仅在UI请求期间调用此方法。只要您与请求处于同一线程中,Vaadin中的任何类型的侦听器都应该是正常的。尝试注入aop范围的代理 例如:
@Scope(value="vaadin-ui", proxyMode=ScopedProxyMode.INTERFACES)
@SpringComponent
public class B implements IB {
}
我认为这应该行得通。Class
A
也需要是UIScope。除了@markrotVeel的注释,还解释了原因:…任何注入该注释的内容都将在同一UI中获得相同的实例。加载不同的UI,您将获得不同的实例。如果会话过期或UI关闭,实例将被清理。
@markrotVeel是的,这是可能的,但是A
类来自公共库,并使用数十个其他类。这意味着我必须向公共库中的每个依赖类添加@UIScope
。但是,在没有UI作用域或Vaadin的spring boot应用程序中也使用了这个公共库。好的,我只为一些真正需要它的类分配了UIScope,现在应该可以工作了。@Mejmo那么您可能需要对它进行子类化,以便可以使用ViewScope对它进行注释,或者使用您使用的注释(而不是发现的组件)定义一个特定的命名bean。