在后台获取国家名称和国家代码时出现 NullPtr 异常

NullPtr exception while getting country names and country codes in backoffice

升级到 Intershop CM 7.10.18.1 后,我们在后台打开商店详细信息页面时遇到 NullPtr 异常。 商店详细信息的 ISML 模板是 EditStore_52.isml,其中包括 ISCountrySelectBox 模块,该模块进一步调用 getCountryNamesAndCodes() 方法。 由于带下划线的调用 returns null,该方法失败并出现 NullPtr 异常。

我们想知道这是否是一个错误以及预期的代码是否应该是:

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

请就这种情况的解决方法提出建议。 以下是异常的堆栈跟踪。

Intershop 通过 Operations 后台传送地址数据,可以是 imported/export(例如使用组织 Operationshttps://localhost:8443/INTERSHOP/web/WFS/SLDSystem 登录)。开箱即用的地址数据如下所示:

<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 的属性值。在您的情况下,一个可能的解决方法是导出数据,包括缺少的属性值并再次导入。

请注意:为此提供修复的工作已经在进行中。对于给您带来的不便,我们深表歉意。

更方便的方法(因为编辑 xml 导入文件很乏味)是使用 guice 模块覆盖替换错误的实现。简而言之:

  • 将 class com.intershop.component.region.internal.geoobject.LocalizedCountryNamesProviderImpl 的原始实现复制粘贴到自定义墨盒中您自己的 class 中。例如:我刚刚在墨盒 app_sf_responsive 中创建了一个 class AppSFLocalizedCountryNamesProviderImpl 来测试它。
  • 根据需要修改以上方法
  • 创建覆盖模块(参见 Cookbook - Dependency Injection and ObjectGraphs)。按照我的示例,模块 configure 操作应如下所示:
    @Override
    protected void configure()
    {
        bind(LocalizedCountryNamesProvider.class).to(AppSFLocalizedCountryNamesProviderImpl.class);
        bindProvider(com.intershop.component.foundation.capi.localization.LocalizedCountryNamesProvider.class)
        .to(AppSFLocalizedCountryNamesProviderImpl.class);
    }
  • 发布你的墨盒,重启你的服务器