在spring @Component

时间:2015-10-14 10:12:17

标签: spring vaadin vaadin7 vaadin-spring-boot

我正在使用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范围内,而不是在启动期间。

2 个答案:

答案 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 {
}

我认为这应该有用。