Как на этапе инициализации экрана редактирования получить редактируемую сущность, заполненную согласно представлению из дескриптора экрана

Здравствуйте!
Пытаюсь создать свое первое приложение на CUBA и столкнулся с проблемой. Не могу получить редактируемую сущность, в которой все поля были бы заполнены, согласно представлению из дескриптора экрана.

В дескрипторе экране описан датаконтейнер:

<data>
        <instance id="dictStorageLocationDc"
                  class="ru.psb.inv.dict.DictStorageLocation" view="dictStorageLocation.full">
            <loader id="dictStorageLocationDl"/>
        </instance>
</data>

Представление содержит данные из всех связанных сущностей:

<view entity="DictStorageLocation" name="dictStorageLocation.full" extends="_local">
        <property name="building" view="_local"/>
        <property name="rankType" view="_local"/>
        <property name="side" view="_local">
            <property name="sideType" view="_local"/>
        </property>
</view>

Но метод StandardEditor::getEditedEntity() никак не хочет возвращать полностью заполненную сущность DictStorageLocation. Вызов getEditedEntity().getSide().getSideType() завершается с ошибкой:

IllegalStateException: Cannot get unfetched attribute [sideType] from detached object ru.psb.inv.dict.DictSide-b9b62a2a-5c5e-8cb4-53fe-ace087af8c93 [detached].

Пробовал вызывать этот метод по разным событиям. Результат один и тот же.

Спасибо за помощь!

Добрый день.

В каких конкретно? В AfterShowEvent все должно быть на месте.

2 симпатии

Михаил, спасибо за ответ!
Даже на событии AfterShowEvent получаю ошибку Cannot get unfetched atribute...

@Subscribe
    public void onInit(AfterShowEvent event) {
        DictSideType sideType = getEditedEntity().getSide().getSideType();
    }

Возможно дело в том, что на экране я использую фасет dataLoadCoordinator. По-всячески его конфигурил: и авторежим, и ручной. Ничего не меняется

Вот полная конфигурация дата-контейнеров и фасетов:

<data>
        <instance id="dictStorageLocationDc"
                  class="ru.psb.inv.dict.DictStorageLocation" view="dictStorageLocation.full">
            <loader id="dictStorageLocationDl"/>
        </instance>
        <collection id="buildingsDc" class="ru.psb.inv.dict.DictBuilding" view="_local">
            <loader id="buildingsDl">
                <query>
                    <![CDATA[select e from DictBuilding e order by e.city,e.name]]>
                </query>
            </loader>
        </collection>
        <collection id="rankTypesDc" class="ru.psb.inv.dict.DictRankType" view="_local">
            <loader id="rankTypesDl">
                <query>
                    <![CDATA[select e from DictRankType e order by e.value]]>
                </query>
            </loader>
        </collection>
        <collection id="sideTypesDc" class="ru.psb.inv.dict.DictSideType" view="_local">
            <loader id="sideTypesDl">
                <query>
                    <![CDATA[select e from DictSideType e order by e.value]]>
                </query>
            </loader>
        </collection>
        <collection id="sideDc" class="ru.psb.inv.dict.DictSide" view="dictSide-with-type">
            <loader id="sideDl">
                <query>
                    <![CDATA[select e from DictSide e where e.sideType=:container_sideTypesDc order by e.value]]>
                </query>
            </loader>
        </collection>
    </data>
    <dialogMode height="600"
                width="800"/>
    <facets>
        <dataLoadCoordinator>
            <refresh loader="dictStorageLocationDl" onScreenEvent="Init"/>
            <refresh loader="buildingsDl" onScreenEvent="Init"/>
            <refresh loader="rankTypesDl" onScreenEvent="Init"/>
            <refresh loader="sideTypesDl" onScreenEvent="Init"/>
            <refresh loader="sideDl" onComponentValueChanged="sideTypeField"/>
        </dataLoadCoordinator>
    </facets>

Похоже, у меня было неправильное сочетание конфигурации фасета dataLoadCoordinator и события для инициализации экрана. При автоматической загрузке данных фасетом и событием AfterShowEvent всё заработало как надо:

<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
    @Subscribe
    public void onInit(AfterShowEvent event) {
        DictSideType sideType = getEditedEntity().getSide().getSideType();
    }

Но всё-равно осталось непонятным, если мне нужно вручную управлять загрузкой данных, почему в редактируемой сущности нет всех данных, если я загружаю их вот так:

<facets>
        <dataLoadCoordinator>
            <refresh loader="dictStorageLocationDl" onScreenEvent="Init"/>
        </dataLoadCoordinator>
    </facets>

Во время срабатывания Init события в экран еще не проставлена редактируемая сущность, поэтому этот refresh триггер бесполезен.

1 симпатия

Александр, спасибо, за разъяснения! Теперь буду знать