Исключение NullPtr при получении названий стран и кодов стран в бэк-офисе - PullRequest
1 голос
/ 27 мая 2020

После обновления до Intershop CM 7.10.18.1 мы получаем исключения NullPtr при открытии страницы сведений о магазине в бэк-офисе. Шаблон ISML для сведений о магазине - EditStore_52.isml, который включает модуль ISCountrySelectBox, который, кроме того, вызывает метод getCountryNamesAndCodes (). Этот метод не работает с исключением NullPtr из-за подчеркнутого вызова, который возвращает значение null. failing method

Нам интересно, является ли это ошибкой и предполагался ли предполагаемый код:

countriesMap.put(country.getId(), country.getDisplayName(currentLocale));

Пожалуйста, посоветуйте обходной путь для этой ситуации. Ниже приведена трассировка стека для исключения.

exception stack trace

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Intershop предоставляет адресные данные, которые можно импортировать / экспортировать через Operations бэк-офис (например, войдите в систему https://localhost: 8443 / INTERSHOP / web / WFS / SLDSystem с помощью организации Operations). Стандартно такие данные адреса выглядят так:

<country>
   <id>DE</id>
   <custom-attributes>
            <custom-attribute dt:dt="string" name="displayName" xml:lang="de-DE">Deutschland</custom-attribute>
            <custom-attribute dt:dt="string" name="displayName" xml:lang="fr-FR">Allemagne</custom-attribute>
            <custom-attribute dt:dt="string" name="displayName" xml:lang="en-US">Germany</custom-attribute>
        </custom-attributes>
</country>

Как видите, они содержат только значения атрибутов displayName для de-DE, fr-FR и en-US. Возможным обходным решением в вашем случае может быть экспорт данных, включение отсутствующих значений атрибутов и их повторный импорт.

Обратите внимание: работа по доставке исправления для этого уже выполняется. Приносим извинения за неудобства.

1 голос
/ 27 мая 2020

Более удобный способ (поскольку редактирование xml файлов импорта утомительно) - заменить ошибочную реализацию с помощью переопределения модуля guice. Вкратце:

  • Скопируйте и вставьте исходную реализацию класса com.intershop.component.region.internal.geoobject.LocalizedCountryNamesProviderImpl в собственный класс в вашем пользовательском картридже. Например: я только что создал класс AppSFLocalizedCountryNamesProviderImpl в картридже app_sf_responsive, чтобы проверить это.
  • Адаптируйте указанный выше метод в соответствии с вашими потребностями
  • Создайте модуль переопределения (см. Cookbook - Внедрение зависимостей и ObjectGraphs ). Следуя моему примеру, работа модулей configure должна выглядеть так:
    @Override
    protected void configure()
    {
        bind(LocalizedCountryNamesProvider.class).to(AppSFLocalizedCountryNamesProviderImpl.class);
        bindProvider(com.intershop.component.foundation.capi.localization.LocalizedCountryNamesProvider.class)
        .to(AppSFLocalizedCountryNamesProviderImpl.class);
    }
  • Publi sh ваш картридж, перезагрузите сервер
...