Ошибка при открытии экрана редактирования сущности с отображаемым динамическим атрибутом на мигрированном проекте

Доброго дня!
Подскажите пожалуйста, на мигрированном проекте, при открытии экрана редактирования сущности, для которой добавлен динамический атрибут типа перечисление, без локализации значений, возникает ошибка.

динамический атрибут

Атрибут типа перечисление, имеет два значения без локализации, расположен на экране редактирования сущности без указания компонента расположения.

image

стэктрейс ошибки
Caused by: java.lang.NullPointerException: null key in entry: null=2
	at com.google.common.collect.CollectPreconditions.checkEntryNotNull(CollectPreconditions.java:31) ~[guava-31.1-jre.jar:na]
	at com.google.common.collect.SingletonImmutableBiMap.<init>(SingletonImmutableBiMap.java:43) ~[guava-31.1-jre.jar:na]
	at com.google.common.collect.ImmutableBiMap.of(ImmutableBiMap.java:81) ~[guava-31.1-jre.jar:na]
	at com.google.common.collect.ImmutableBiMap.copyOf(ImmutableBiMap.java:566) ~[guava-31.1-jre.jar:na]
	at com.google.common.collect.ImmutableBiMap.copyOf(ImmutableBiMap.java:544) ~[guava-31.1-jre.jar:na]
	at io.jmix.ui.component.OptionsField.setOptionsMap(OptionsField.java:75) ~[jmix-ui-1.5.5.jar:na]
	at com.haulmont.cuba.gui.dynamicattributes.CubaDynAttrComponentGenerationStrategy.createEnumerationField(CubaDynAttrComponentGenerationStrategy.java:182) ~[jmix-cuba-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.factory.DynAttrComponentGenerationStrategy.createDatatypeField(DynAttrComponentGenerationStrategy.java:168) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.factory.DynAttrComponentGenerationStrategy.createComponentInternal(DynAttrComponentGenerationStrategy.java:127) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.factory.DynAttrComponentGenerationStrategy.createComponent(DynAttrComponentGenerationStrategy.java:110) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.ui.component.UiComponentsGenerator.generate(UiComponentsGenerator.java:51) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.FormEmbeddingStrategy.addAttributeComponent(FormEmbeddingStrategy.java:79) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.FormEmbeddingStrategy.embed(FormEmbeddingStrategy.java:52) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.impl.BaseEmbeddingStrategy.embed(BaseEmbeddingStrategy.java:79) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.DynAttrEmbeddingStrategies.embedAttributes(DynAttrEmbeddingStrategies.java:38) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.facet.DynAttrFacetProvider.lambda$loadFromXml$0(DynAttrFacetProvider.java:59) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkThroughComponent(ComponentsHelper.java:272) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkComponents(ComponentsHelper.java:252) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkThroughComponent(ComponentsHelper.java:279) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkComponents(ComponentsHelper.java:252) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkThroughComponent(ComponentsHelper.java:279) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkComponents(ComponentsHelper.java:252) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkThroughComponent(ComponentsHelper.java:279) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.__walkComponents(ComponentsHelper.java:252) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.component.ComponentsHelper.walkComponents(ComponentsHelper.java:247) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.dynattrui.facet.DynAttrFacetProvider.lambda$loadFromXml$1(DynAttrFacetProvider.java:58) ~[jmix-dynattr-ui-1.5.5.jar:na]
	at io.jmix.ui.xml.layout.loader.ComponentLoaderContext.executeInitTasks(ComponentLoaderContext.java:167) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.sys.ScreensImpl.createScreen(ScreensImpl.java:227) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.sys.ScreensImpl.create(ScreensImpl.java:133) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.builder.EditorBuilderProcessor.createScreen(EditorBuilderProcessor.java:298) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.builder.EditorBuilderProcessor.buildEditor(EditorBuilderProcessor.java:88) ~[jmix-ui-1.5.5.jar:na]
	at io.jmix.ui.builder.EditorClassBuilder.build(EditorClassBuilder.java:169) ~[jmix-ui-1.5.5.jar:na]

Если добавить локализацию значениям перечисления ошибка не возникает, но они отображаются некорректно, с добавлением имени локали(ей).

исправленный динамический атрибут

Атрибут типа перечисление, имеет два значения с локализацией, расположен на экране редактирования сущности без указания компонента расположения.

image

некорректное отображение динамического атрибута

значения перечисления отображаются в виде "ru/<значение перечисления>=<локализованное значение> en/<значение перечисления>=<локализованное значение>"

image

Добавлю, что на тестовом проекте ошибка не воспроизводится как при отсутствии локализованных значений перечисления, так и при их добавлении.

Подскажите в какую сторону глядеть? Может проект миграции тянет устаревший аддон? Или что-то в пакетах локализованных сообщений некорректно мигрировало?

PS

На форуме есть две отдельные темы для каждой из наших проблем (экран, отображение). В них коллега @gena утверждает, что решил проблему “удалив все зависимости от cuba, которые стали конфликтовать с jmix” (с). Т.к. у нас проект мигрирован с CUBA, у нас в проекте присутствуют некоторые зависимости из прошлой платформы. Под зависимостями я имею ввиду использование классов из пакетов com.haulmont.cuba или xmlns:cuba. Приняв это во внимание, мы экспериментировали на экранах, в дескрипторах и контроллерах которых нет тех самых зависимостей, размещая там динамические атрибуты, но попытки были тщетны.

Так же добавляли отдельно зависимости в build.gradle - не помогло.

implementation 'io.jmix.dynattr:jmix-dynattr-starter'
implementation 'io.jmix.dynattr:jmix-dynattr-ui-starter'
обстановка

Проект мигрирован с CUBA 7.2
Jmix version: 1.5.5
Jmix Studio plugin version: 2.3.2-241
IntelliJ version: IntelliJ IDEA 2024.1 (Community Edition)

Добрый день!

Самый простой способ будет вручную продебажить библиотеку, раз у вас CUBA зависимости, никаких гарантий дать не могу. Вообще в целом было бы хорошо, если бы зависимости от CUBA в проект не было, тк вероятны конфликты. Что могу предложить

Предложение

  1. Проверить формат локализации:
    Примерно так должна выглядеть лока в базе
    #
    #Mon Sep 02 19:05:50 MSK 2024
    en/asdasd=asd
    ru/asdasd=фсд

    В Jmix 1.5.5 вот так должны выглядеть локали в атрибутах (Entity Inspector > Category Attribute > All localization enumeration values)
    image

  2. Проверить io.jmix.dynattr.MsgBundleTools#getMsgBundleValues (ну и другие методы класса) которые отдают локализованные значения атрибутов из базы данных.

  3. Продебагать где это дело падает, возможно баг… (но я сомневаюсь что дело в Jmix DynAttr)

PS

Какое-то детальное решения я вряд ли смогу предложить.

Однако, по описанию ошибки (null key in entry: null=2) могу сказать, что io.jmix.dynattr.MsgBundleTools#getMsgBundleValues возвращает что-то не то, вероятно /n/r ломает импорт локализации.

С Уважением,
Дмитрий

Добрый день!
Дмитрий @d.cherkasov, благодарю за развернутый ответ!

Как и предполагалось, ошибка возникает из-за аддона миграции.
Когда он подключен к проекту, то создание компонента экрана для отображения дин.атрибута перечисления вызывается com.haulmont.cuba.gui.dynamicattributes.CubaDynAttrComponentGenerationStrategy#createEnumerationField.

для создания компонента

image

для формирования options-значений

image

При инициализации LookupFild’а внутри этого метода используются методы из io.jmix.dynattr.MsgBundleTools:

для инициализации options-значений `#getEnumMsgBundleValues`

image

для инициализации локализованного каждого options-значения`#getMsgBundle`

image

Так вот #getMsgBundle возвращает все локали целиком.

Соответственно при отсутствии локализованных значений перечисления ошибка возникает при попытке положить в map ключ null.

при отсутствии локализованных значений

image

К сожалению, пока не воспроизведен (или заменен) нужный нам функционал из CUBA (напр. AppFolder), мы не можем отказаться от зависимости аддона миграции 'io.jmix.cuba:jmix-cuba-starter'.

воспроизведение
  1. создать тестовый проект jmix 1.5.5
  2. добавить вторую локализацию(Ру)
  3. добавить сущность(и экраны к ней)
  4. запустить
  5. дополнить сущность динамическим атрибутом типа перечисление
  6. добавить его на экран редактирования
  7. подключить к приложению аддон миграции
  8. запустить и открыть экран редактирования

проблемы см. первый пост

значение локалей в атрибутах

image

2 симпатии