【问题标题】:autowired vaadin component gets index -1自动装配的 vaadin 组件获取索引 -1
【发布时间】:2017-10-16 04:46:48
【问题描述】:

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

@UIScope @SpringComponent public class Menu extends CssLayout

两个类都有注释

@UIScope @SpringView

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

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

@Override public void enter(ViewChangeEvent event)

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

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

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

我做错了什么?

【问题讨论】:

  • 我怀疑您的菜单是singleton,这是春季的默认范围。同时,一个 Vaadin 组件在任何时候都只能有一个父级,例如,您不能在 2 个不同的视图中包含相同的菜单实例。因此,只需将其设为prototype,这样您每次都会获得一个新实例。否则,请发布更多代码或sscce(如果可能)
  • 你完全正确。请对此评论做出回答,让我批准!

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


【解决方案1】:

索引 -1 表示在子级中未找到该组件。

现在,如果您的组件是 singleton,也就是 Spring bean 的 default scope,那么您总是会得到相同的实例。此外,Vaadin 组件在任何给定时间都只能有one parent,因此您可能在日志中遗漏了一些IllegalStateException

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

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2018-10-26
    • 2022-09-30
    • 2013-10-18
    • 2013-04-06
    相关资源
    最近更新 更多