检索并分配 jcr:mixinTypes magnolia 中的多值属性

Posted

技术标签:

【中文标题】检索并分配 jcr:mixinTypes magnolia 中的多值属性【英文标题】:Retrieve and assign jcr:mixinTypes a multi-valued property in magnolia 【发布时间】:2020-01-30 10:28:00 【问题描述】:

当我尝试在 magnolia 中获取多值属性时出现错误,因为我将它分配给 String 类型。如何正确读取单值和多值属性(因为两者都存在)?

javax.jcr.ValueFormatException: 属性 /wcmstest/de/search/jcr:mixinTypes 是一个多值属性,所以它是 值只能作为数组检索 在 org.apache.jackrabbit.core.PropertyImpl.internalGetValue(PropertyImpl.java:483) 在 org.apache.jackrabbit.core.PropertyImpl.getValue(PropertyImpl.java:510) 在 org.apache.jackrabbit.core.PropertyImpl.getString(PropertyImpl.java:520) 在 info.magnolia.jcr.wrapper.DelegatePropertyWrapper.getString(DelegatePropertyWrapper.java:162) 在 info.magnolia.jcr.wrapper.DelegatePropertyWrapper.getString(DelegatePropertyWrapper.java:162) 在 info.magnolia.jcr.wrapper.DelegatePropertyWrapper.getString(DelegatePropertyWrapper.java:162) 在 info.magnolia.jcr.wrapper.DelegatePropertyWrapper.getString(DelegatePropertyWrapper.java:162) 在 info.magnolia.jcr.wrapper.DelegatePropertyWrapper.getString(DelegatePropertyWrapper.java:162) 在 ch.uzh.module.versioning.CreateNestedMap.nestedMap(CreateNestedMap.java:32) 在 ch.uzh.module.versioning.ContextLoggerCommand.execute(ContextLoggerCommand.java:78) 在 info.magnolia.commands.MgnlCommand.executeSynchronized(MgnlCommand.java:80) 在 info.magnolia.commands.MgnlCommand.execute(MgnlCommand.java:69) 在 info.magnolia.commands.chain.ChainBase.execute(ChainBase.java:101) 在 info.magnolia.commands.DelegateCommand.execute(DelegateCommand.java:66) :

这是我正在使用的代码:

 HashMap<String, Object> map = new LinkedHashMap<>();
 PropertyIterator pi;
 try 
    pi = node.getProperties();
    //Get properties for the root node
    while(pi.hasNext())
    
        Property p = pi.nextProperty();
        String name = p.getName();
        String val = p.getString();

        map.put(name,val);

    //end of while for properties of root node
  catch (RepositoryException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
 

【问题讨论】:

***.com/questions/42822066/… ? 谢谢@reporter 我会试一试,如果 prop.isMultiple() 将它存储为数组。我想知道这个存储多值属性的数组应该是什么类型? 我只与 Magnolia 的“大姐姐”合作,调用 Adob​​e Experience Manager -short AEM-。它提供了一个允许查看存储节点的 gui。叫crx。 Magnolia 似乎也提供了这样的 gui。以你的例子:你的目标节点的类型是一个字符串并且有多个值,那么你需要字符串[],否则是字符串。 helpx.adobe.com/content/dam/help/en/experience-manager/6-2/… 来自 AEM crx gui 的图片。 jcr api 也提供了一种确定节点类型的方法。 【参考方案1】:

感谢@reporter 和一些反复试验。这是working solution

           HashMap<String, Object> map = new LinkedHashMap<>();

           PropertyIterator pi;
            try 
                pi = node.getProperties();
                //Get properties for the root node
                while(pi.hasNext())
                    
                       Property p = pi.nextProperty();
                       String name = p.getName();
                       String val;
                       //determine if property is multi-value
                       if (p.isMultiple()) 
                            //multi-value property           
                            val=p.getValues().toString();

                         else 
                            //single-value property
                            val = p.getValue().getString();

                        
                        map.put(name,val);

                    //end of while for properties of root node
             catch (RepositoryException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

【讨论】:

以上是关于检索并分配 jcr:mixinTypes magnolia 中的多值属性的主要内容,如果未能解决你的问题,请参考以下文章

如何检索名称 | Listview中多个选中项目的值对?

使用分配器挂钩时如何检索被释放的字节?

从数据库中检索记录时,如何将图像分配给学生记录?

如何检索操作栏的标题并将其分配给文本视图?

为遗传算法分配和检索按位内存值

SonarQube API:检索分配给项目权限的用户列表?