Как положить в combobox атрибуты сущности?

Добрый день!
У меня есть следующий DetailView:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://dialogWindowConditionUiDtoDetailView.title"
      focusComponent="form">
    <data>
        <instance id="recordUiDtoDc"
                  class="ru.ctsg.damdbf.manager.ui.dto.RecordUiDto">
            <fetchPlan extends="_base"/>
            <loader/>
        </instance>
        <collection id="attributesRecordUiDtoDc"
                    class="ru.ctsg.damdbf.manager.ui.dto.RecordUiDto">
            <fetchPlan extends="_base"/>
            <loader/>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"/>
    </facets>
    <actions>
        <action id="saveAction" type="detail_saveClose"/>
        <action id="closeAction" type="detail_close"/>
    </actions>
    <layout>
        <formLayout id="form" dataContainer="recordUiDtoDc">
            <comboBox id="comboBox" dataContainer="attributesRecordUiDtoDc" required="true"/>
            <comboBox id="operator" property="operator" required="true"/>
            <comboBox id="inputMode" property="inputMode" required="true"/>
        </formLayout>
        <hbox id="detailActions">
            <button id="saveAndCloseBtn" action="saveAction"/>
            <button id="closeBtn" action="closeAction"/>
        </hbox>
    </layout>
</view>

Есть dto:

@JmixEntity
public class RecordUiDto {

    private String query;

    private QueryType queryType;

    private Date timestamp;

    private String command;

    private String tableName;

    private String tableAlias;

    private String attributeName;

    private String attributeAlias;

    private PropertyCondition.Operator operator;

    private InputMode inputMode;

Я пытаюсь сделать следующее: нужно в поле, которое является combobox положить все атрибуты, которые есть в RecordUiDto. Чтобы получился такой выпадающий список:
image
Пробовал у RecordUiDto вытащить все properties и положить их в контейнер attributesRecordUiDtoDc для combobox:

    @Subscribe
    public void onInit(final InitEvent event) {
        MetaClass metaClass = metadata.getClass(RecordUiDto.class);

        List<MetaProperty> properties = metaClass.getProperties().stream()
                .toList();
        attributesRecordUiDtoDc.setItems(properties);

    }

но получаю следующую ошибку: GuiDevelopmentException: Can't set container 'attributesRecordUiDtoDc' for component 'comboBox' because 'property' attribute is not defined. Не очень понимаю, а что в моем случае я должен установить для поля property?

  1. Вы поставили в поле аттрибут dataContainer collection container attributesRecordUiDtoDc. Это поле связывает вашу сущность с полем. Скорее всего вы имели в виду аттрибут itemsContainer, для передачи в comboBox списка вариантов.

  2. По коду. У вас attributesRecordUiDtoDc class = RecordUiDto, но вы пытаетесь положить в него MetaProperty

  3. Наврядли вы сможете положить MetaProperty в контейнер, ведь это не сущность. Попробуйте положить список MetaProperty на прямую в comboBox без dataContainer
    comboBox :: Документация Jmix

  4. Я не уверен что MetaProperty можно класть в comboBox (Хотя можно попробовать). Скорее всего вам придется класть имена пропертей в comboBox.

@yarik1706 в целом получается то, что нужно) вот так пока реализовал:

    @Subscribe
    public void onInit(final InitEvent event) {
        MetaClass metaClass = metadata.getClass(RecordUiDto.class);

        List<MetaProperty> properties = metaClass.getProperties().stream()
                .toList();

        List<String> propertyNames = properties.stream()
                .map(metaProperty -> messages.getMessage(metaProperty.getName()))
                .toList();

        attributesComboBox.setItems(propertyNames);
    }

но есть два нюанса:

  1. Значения для выбора отображаются на английском, хотя добавил для них локализацию. Не понимаю, почему так?
  2. При раскрытии combobox все атрибуты лежат в одном элементе, а должны каждый в своем соответственно. Как тут можно это исправить? Скрин прилагаю
    image

messages.getMessage(metaProperty.getName()))
Изучите как работает messages. Вам скорее нужен MessageTools.getPropertyCaption(MetaProperty) или MessageTools.getPropertyCaption(MetaClass metaClass, String propertyName)
И я не рекомендую сразу локализованные значения класть в comboBox. Лучше использовать
itemLabelGenerator

Вот это странно… Они через запятую еще. Вы уверены что тот код прислали? Такое ощущение что там где-то join есть.

Мб у вас в проекте создалась папка .jmix в котором старый код?

@yarik1706 спасибо, с message разберусь, а с отображением в одном элементе всех атрибутов разобрался, там нужно было использовать у ComboBoxListDataView метод add, куда класть каждое свойство в отдельности. Вот так теперь отображается как нужно:

@Subscribe
public void onInit(final InitEvent event) {
    MetaClass metaClass = metadata.getClass(RecordUiDto.class);

    List<MetaProperty> properties = metaClass.getProperties().stream()
            .toList();

    ComboBoxListDataView<Object> objectComboBoxListDataView = attributesComboBox.setItems();

    for (MetaProperty metaProperty : properties) {
        String propertyName = messages.getMessage(metaProperty.getName());
        objectComboBoxListDataView.addItem(propertyName);
    }
}

Большое спасибо за помощь!

Это канечно странно… Ибо через attributesComboBox.setItems(propertyNames); должно норм работать. Но окей…