我正在使用Vaadin Spring 1.0.0并试图找出如何将只在UI范围内可用的bean(当用户打开页面时)注入经典的spring @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在启动时初始化,但我使用在@Component
的Spring中实现的公共库,我想实现一些接口,但我可以做到仅在UI范围内,而不是在启动期间。
答案 0 :(得分:0)
您需要从ApplicationContext
本身获取它:
@Component
public class A {
@Autowired
private ApplicationContext context;
public B getCurrentB(){
return context.getBean(B.class);
}
}
请注意,如果没有绑定到当前线程的UI(通常),它将抛出异常。换句话说,您必须确保仅在UI请求期间调用此方法。 Vaadin中的任何类型的监听器都应该没问题,只要你在请求的同一个线程中。
答案 1 :(得分:0)
尝试注入aop范围代理。
例如:
@Scope(value="vaadin-ui", proxyMode=ScopedProxyMode.INTERFACES)
@SpringComponent
public class B implements IB {
}
我认为这应该有用。