我使用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组件而不是下一个。
我做错了什么?
答案 0 :(得分:1)
索引-1表示在子项中找不到该组件。
现在,如果你的组件是singleton,它是spring bean的default scope,那么你总是得到相同的实例。此外,Vaadin组件在任何给定时间只能有one parent,因此您可能错过了日志中的一些IllegalStateException
。
要解决此问题,您可以将菜单范围设置为prototype,以便每次都获得一个新实例。