在后台获取国家名称和国家代码时出现 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(例如使用组织 Operations
在 https://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);
}
- 发布你的墨盒,重启你的服务器
升级到 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(例如使用组织 Operations
在 https://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
中创建了一个 classAppSFLocalizedCountryNamesProviderImpl
来测试它。 - 根据需要修改以上方法
- 创建覆盖模块(参见 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);
}
- 发布你的墨盒,重启你的服务器