Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将vaadin@UIScope bean注入spring@组件_Spring_Vaadin_Vaadin7_Vaadin Spring Boot - Fatal编程技术网

将vaadin@UIScope 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

我正在使用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在启动时初始化,但我使用在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。