autowired vaadin组件获得索引-1

时间:2017-05-16 22:37:18

标签: java spring vaadin vaadin8 vaadin-spring-boot

我使用vaadin-spring。我创建了public abstract class AbstractBasicVerticalLayoutWithMenu extends HorizontalLayout implements View,我有两个普通的类来扩展它。在抽象类I @Autowire中定义了菜单组件:

@UIScope @SpringComponent public class Menu extends CssLayout

这两个类都有注释

@UIScope @SpringView

我在其中一个视图中遇到一个非常奇怪的问题,即我的菜单组件没有显示。

我做了一些挖掘并添加了日志记录。在

@Override public void enter(ViewChangeEvent event)

方法我添加了日志并尝试了许多thigs,我发现当我this.getComponentIndex(menu)时,错误的视图组件的索引为-1!

有趣的是,如果我从导航器中删除了正确显示的视图(我这样做:getNavigator().addView(FirstTesterView.VIEW_NAME, firstTesterView);),那么这个错误的视图将恢复正确。

我不知道为什么,但看起来只有第一个扩展acstract的实例化类获得@Autowired组件而不是下一个。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

索引-1表示在子项中找不到该组件。

现在,如果你的组件是singleton,它是spring bean的default scope,那么你总是得到相同的实例。此外,Vaadin组件在任何给定时间只能有one parent,因此您可能错过了日志中的一些IllegalStateException

要解决此问题,您可以将菜单范围设置为prototype,以便每次都获得一个新实例。