首页 > 解决方案 > 检索并分配 jcr:mixinTypes magnolia 中的多值属性

问题描述

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

javax.jcr.ValueFormatException: property /wcmstest/de/search/jcr:mixinTypes 是一个多值属性,所以它的值只能在 org.apache.jackrabbit.core.PropertyImpl.internalGetValue(PropertyImpl.java :483) at org.apache.jackrabbit.core.PropertyImpl.getValue(PropertyImpl.java:510) at org.apache.jackrabbit.core.PropertyImpl.getString(PropertyImpl.java:520) at 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。链.ChainBase.execute(ChainBase.java:101) 在 info.magnolia.commands.DelegateCommand.execute(DelegateCommand.java:66) :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) :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();
 }

标签: javajcrmagnolia

解决方案


感谢@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();
            }

推荐阅读