2017-05-16 102 views
0

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

@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

我怀疑你的菜单是[singleton](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-singleton)这是春天的默认范围。同时,Vaadin组件在任何时候都只能有一个父项,例如,不能在两个不同的视图中包含相同的菜单实例。所以,只需将它制作为[原型](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype),以便获得每次都有新的实例。否则,请发布更多代码或者[sscce](http://sscce.org) – Morfic

+0

你是完全正确的。请从这个评论回答我的批准! – Mateusz

回答

1

指数-1表示该组件在儿童中未找到。

现在,如果你的组件是singleton,这是Spring bean的default scope,那么你总是会得到相同的实例。此外,Vaadin组件在任何时候都只能有one parent,所以可能你在日志中错过了一些IllegalStateException

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