首页 > 解决方案 > Impex 导出:多值属性中的冒号被双反斜杠转义 - 如何删除此行为?

问题描述

Hybris:6.3.0.0-SNAPSHOT(行为与6.3.0.21相同)

在导出 impex 时,我们注意到导出非多值类型属性与导出多值类型属性时的差异。

导出不带冒号的 String 属性数据时,可以将非多值属性导出为Experts,而将多值属性导出为Experts|Hybris

当使用冒号(例如 URL)导出带有字符串属性数据的类型时,冒号用双反斜杠转义(仅适用于多值)。非多值属性可以导出为https://experts.hybris.com,而多值属性可以导出为https\://experts.hybris.com如果只有 1 个值或https\://如果有 2 个值,experts.hybris.com|https\://help.hybris.com 。

如何阻止导出从冒号逃逸?有没有我可以重写的方法来改变这种行为?我想将结果更改为https://experts.hybris.com|https://help.hybris.com" https://experts.hybris.com "|" https://help.hybris。 com

商业案例:我们想从导出的 impex 中复制 URL,但 URL 包含双反斜杠。导出的 impex 并不意味着重新导入。

注意 #`: URL 存储在一个集合中(例如 Product.newAttribute,其中 newAttribute 是具有字符串的自定义类型的集合)。因此,Impex 标头看起来像“INSERT_UPDATE Product;newAttribute(data)”

注释#2:(更新:没用)目前,我正在检查是否可以使用 CSVCellDecorator;这仅用于进口。

注释 #3:目前,我正在检查 AbstractSpecialValueTranslator 是否可行。

标签: hybris

解决方案


对于这种特殊情况,我创建了一个新的转换器,扩展了 AbstractValueTranslator。然后,我实现了 exportValue 方法,加入了字符串数据(它们是 URL),而不转义它们。

public String exportValue(final Object value) throws JaloInvalidParameterException
{
    String joinedString = "";
    if (value instanceof Collection)
    {
        final Collection valueCollection = (Collection) value;
        if (!valueCollection.isEmpty())
        {
            final ArrayList<CustomType> list = (ArrayList<CustomType>) valueCollection;
            final StringJoiner joiner = new StringJoiner("|");
            for (final CustomType customType : list)
            {
                // data is a URL
                joiner.add(customType.getData());
            }
            // value would be something like "https://experts.hybris.com|https://help.hybris.com"
            joinedString = joiner.toString();
        }
    }

    return joinedString;
}

参考:


推荐阅读