2

私は Vaadin Spring 1.0.0 を使用しており、(ユーザーがページを開いたときに) UI スコープ内でのみ使用できる Bean を従来の Spring Bean に注入する方法を見つけようとしています@Component。簡単に、クラスを作りましょう:

@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 に答える