Заполнение TreeTable в новой версии платформы

Добрый день.
Используем версию платформы 7.0.3.

В Контроллере экрана добавил:

     <data>
        <instance id="emplDc" class="com.svb.empl.entity.Empl" view="empl-view">
            <loader/>
            <collection id="orgunitsDc" property="orgunits"/>
        </instance>
        <collection id="orgUnitsDs" class="com.svb.empl.entity.OrgUnit" view="_local"/>
    </data>

Хочу заполнить данными элемент tree:

  <vbox margin="true" spacing="true">
       <tree id="orgUnitsTree" caption="msg://orgunitsTree" enable="false" 
       width="100%" height="100px"
       stylename="well" dataContainer="orgUnitsDs"
       hierarchyProperty="shortname"/>
 </vbox>

Подскажите пожалуйста, на каком событии экрана лучше начать добавлять данные в orgUnitsDs ?

По логике и по документации данные на экране надо загружать, в общем случае, в onBeforeShow.
С TreeTable что-то идет не так?

1 симпатия

Добрый день.

Реализовал в методе onBeforeShow заполнение Datacontainer для TreeTable:

@Subscribe
private void onBeforeShow(BeforeShowEvent event) {
    Empl empl = getEditedEntity();
    try {
        // Подразделения
        List<OrgUnit> orgUnitList = empl.getOrgunits();
        if (! CollectionUtils.isEmpty(orgUnitList)) {
            logger.info ("Adding OrgUnits Info");
            for (OrgUnit du : orgUnitList) {
                orgUnitsDs.getMutableItems().add(du);
                
                logger.info ("Get Parent OrgUnits");
                List<OrgUnit> parent = du.getParent();
                
                if (parent != null) {
                    for (OrgUnit unit : parent) {
                        orgUnitsDs.getMutableItems().add(unit);
                    }
                }
            }
            
            logger.info(String.valueOf(orgUnitsDs1.getItems().size()));
        }
        orgUnitsTree.expandTree();
    } catch (Exception e) {
        e.printStackTrace();
        logger.error("onBeforeShow: "+
                e.getMessage());
    }
}

Но при отрытии экрана возникает ошибка:

java.lang.ClassCastException: java.lang.String cannot be cast to com.haulmont.cuba.core.entity.Entity
	at com.haulmont.cuba.gui.components.data.tree.ContainerTreeItems.lambda$getChildren$0(ContainerTreeItems.java:120)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.LongPipeline.reduce(LongPipeline.java:438)
	at java.util.stream.LongPipeline.sum(LongPipeline.java:396)
	at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
	at com.haulmont.cuba.gui.components.data.tree.ContainerTreeItems.getChildCount(ContainerTreeItems.java:111)
	at com.haulmont.cuba.gui.components.data.tree.ContainerTreeItems.getChildCount(ContainerTreeItems.java:33)
	at com.haulmont.cuba.web.gui.components.tree.TreeDataProvider.getChildCount(TreeDataProvider.java:106)
	at com.vaadin.data.provider.HierarchyMapper.getDirectChildren(HierarchyMapper.java:494)
	at com.vaadin.data.provider.HierarchyMapper.getChildrenStream(HierarchyMapper.java:525)
	at com.vaadin.data.provider.HierarchyMapper.lambda$getHierarchy$1(HierarchyMapper.java:482)
	at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)
	at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.LongPipeline.reduce(LongPipeline.java:438)
	at java.util.stream.LongPipeline.sum(LongPipeline.java:396)
	at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
	at com.vaadin.data.provider.HierarchyMapper.getTreeSize(HierarchyMapper.java:88)
	at com.vaadin.data.provider.HierarchicalDataCommunicator.getDataProviderSize(HierarchicalDataCommunicator.java:405)
	at com.vaadin.data.provider.DataCommunicator.sendDataToClient(DataCommunicator.java:358)
	at com.vaadin.data.provider.DataCommunicator.beforeClientResponse(DataCommunicator.java:338)
	at com.vaadin.server.communication.UidlWriter.write(UidlWriter.java:118)
	at com.vaadin.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:115)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:84)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)

В первой строке лога ключевая проблема: java.lang.String cannot be cast to com.haulmont.cuba.core.entity.Entity.

У вас hierarchyProperty="shortname". Судя по всему, атрибут shortname это строка, сокращенное наименование.

А в атрибуте hierarchyProperty нужно указать имя атрибута сущности, являющегося ссылкой на саму себя (т.е. наследника Entity).
Это честно сказано в документации.
Думаю проблема где-то тут.

1 симпатия

Спасибо. Ведь в старой версии платформы делал же такое, а вот в новой почему-то не догадался.