2

我正在使用 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.IllegalStateException: No VaadinSession bound to current thread

正常的方法是什么?我理解整个概念,当 UI 范围不可用时,bean 会在启动时初始化,但是我使用在 Spring 中实现的公共库,@Component并且我想实现一些接口,但我只能在 UI 范围和不是在启动期间。

4

2 回答 2

1

尝试注入一个 aop 范围的代理。

例如:

@Scope(value="vaadin-ui", proxyMode=ScopedProxyMode.INTERFACES)
@SpringComponent
public class B implements IB {
}

我认为这应该有效。

于 2015-10-15T00:33:27.617 回答
-1

您需要从ApplicationContext自身获取它:

@Component
public class A {

      @Autowired
      private ApplicationContext context;

      public B getCurrentB(){
            return context.getBean(B.class);
      }
}

请注意,如果没有 UI 绑定到当前线程(通常),它将抛出异常。换句话说,您必须确保仅在 UI 请求期间调用此方法。Vaadin 中的任何类型的侦听器都应该没问题,只要您与请求在同一个线程中。

于 2015-10-14T13:42:44.380 回答